
Smack3.4.1文档翻译:文件传输,File Transfer
文件传输扩展允许用户传送及接收文件。
•. 向另一位用户发送一个文件
相关 的 JEP : JEP-95 JEP-96 JEP-65 JEP-47
说明
一个用户可能想要向另一个用户发送一个文件。另一个用户可以接受、拒绝或无视该用户的请求。Smack提供了一个简单的接口,可用来发送文件。
用法
要想发送一个文件,妳必须首先创建一个 FileTransferManager 类实例。这个类有一个构造函数,只有一个参数,即为当前的连接Connection 对象。要想实例化该管理器,妳应当调用 new FileTransferManager(connection)
当妳创建了 FileTransferManager 之后,妳需要创建一个外发文件传输对象,以便发送一个文件。应当使用 FileTransferManager 的 createOutgoingFileTransfer(userID) 方法。其中的userID参数是妳想要向其发送文件的那位用户的完整jabber 用户名。一个完整的jabber用户名包括一个节点、一个域名和一个资源名,该用户必须已经连接到该资源,才能接受这个文件传输请求。
现在有了 OutgoingFileTransfer实例了,妳可以发送该文件了。用来传送文件的方法是 sendFile(file, description) 。妳提供的file参数应当是本地文件系统中的一个可读文件,description参数是一段关于该文件的简短说明文字,用于帮助对方用户决定是否要接收该文件。
对于如何监视文件传输进度 的信息,参数 本文档中的 监视进度 小节。
OutgoingFileTransfer 还提供了其它的用于发送文件的手段。请参考对应的Javadoc以了解更多细节。
示例
在本示例中,我们可以看看如何发送一个文件:
// 创建文件传输管理 器
FileTransferManager manager = new FileTransferManager(connection);
// 创建外发文件传输对象
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer( "romeo@montague.net" );
// 发送文件
transfer.sendFile(new File( "shakespeare_complete_works.txt" ), "You won't believe this!" );
说明
用户可能想要接收另一位用户发来的文件。接收文件的过程是由事件驱动的,来自其它用户的新文件传输请求是通过一个注册到文件传输管理器的监听器来接收到的。
用法
要想接收文件,妳首先必须构造一个 FileTransferManager 实例。这个类有一个构造函数,只有一个参数,即为妳的当前连接Connection。要想实例化该管理器,妳应当调用 new FileTransferManager(connection)
当妳创建了 FileTransferManager之后,妳需要向它注册一个监听器。FileTransferListner接口有一个方法, fileTransferRequest(request) 。当妳通过这个方法收到一个请求时,妳可以接受或者拒绝该请求。为了帮助妳做出决定,在 FileTransferRequest 类中有多个方法,可以用来获取关于该传输请求的一些信息。
要接受该文件传输请求,则调用 accept() ,这个方法将创建一个 IncomingFileTransfer 。当妳获取到了该文件传输对象之后,妳可以调用 recieveFile(file) 来启动该文件的传输过程。所提供给该方法的file参数,将被用于保存所接收到的文件中的内容。
最后,如果想要拒绝该文件传输的话,妳只需要调用 IncomingFileTransfer 的 reject() 方法。
关于如 何 跟踪文件传输进度 ,参考 此文档中的 跟踪进度 小节。
IncomingFileTransfer 还提供了其它的用于接收文件的手段。请参考对应的Javadoc以了解更多细节。
示例
在这个示例中,我们能够学到如何接受或拒绝一个文件传输请求:
// 创建文件传输管理 器
final FileTransferManager manager = new FileTransferManager(connection);
// 创建监听 器
manager.addFileTransferListener(new FileTransferListener() {
public void fileTransferRequest(FileTransferRequest request) {
// 检查 是否应当接受该请求
if(shouldAccept(request)) {
// 接受
IncomingFileTransfer transfer = request.accept();
transfer.recieveFile(new File( "shakespeare_complete_works.txt" ));
} else {
// 拒绝
request.reject();
}
}
});
说明
在文件传输过程中,妳可能想要跟踪其传输进度。
用法
IncomingFileTransfer 和 OutgoingFileTransfer 都继承于 FileTransfer 类,这个基类提供了多个方法,用于跟踪文件传输的进度:
•. getStatus() - 文件传输可能处于多个状态中的一个:协商、已拒绝、已取消、进行中、出错及完成。这个方法会返回该文件传输过程当前所处的状态。
•. getProgress() - 如果该文件传输处于进行中的状态,则,此方法会返回一个位于0到1之间的数字,0表示传输过程尚未开始,1表示传输过程已经完成。如果文件传输并非处于进行中的状态,则,它会返回-1。
•. isDone() - 类似于getProgress(),不同之处就是,它返回一个逻辑值( boolean )。如果状态为被拒绝、已取消、出错或已完成,则会返回真(true),其它情况则返回假(false)。
•. getError() - 如果在传输过程中出现错误,则,此方法返回所发生的错误的类型。
示例
在此示例中,我们可以学到,如何跟踪文件传输进度:
while(!transfer.isDone()) {
if(transfer.getStatus().equals(Status.ERROR)) {
System.out.println( "ERROR!!! " + transfer.getError());
} else {
System.out.println(transfer.getStatus());
System.out.println(transfer.getProgress());
}
sleep(1000);
}
未知美人
HxLauncher: Launch Android applications by voice commands