在使用 Smack 库和 open-fire 服务器在 android 中传输文件时出现问题,在将文件传输到另一台设备时在其他设备上收到空文件,它显示 0KB 大小。当我打开它时,它显示空白屏幕。我没有知道它背后的问题是什么。
我正在使用这个链接来实现。我的代码是:
public void ReceiveFile() {
ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection);
if (sdm == null)``
{
sdm = new ServiceDiscoveryManager(connection);
Log.e("service discovery", "SDM");
sdm.addFeature("http://jabber.org/protocol/disco#info");
sdm.addFeature("jabber:iq:privacy");
}
FileTransferManager manager = new FileTransferManager(connection);
Log.e("after manager", "manager");
manager.addFileTransferListener(new FileTransferListener() {
public void fileTransferRequest(final FileTransferRequest request) {
new Thread(){
@Override
public void run() {
Log.e("Thread running", "starting");
IncomingFileTransfer transfer = request.accept();
File mf = Environment.getExternalStorageDirectory();
Log.e("path", mf.getAbsoluteFile()+"/DCIM/" + transfer.getFileName());
File file = new File(mf.getAbsoluteFile()+"/DCIM/" + transfer.getFileName());
try{
transfer.recieveFile(file);
while(!transfer.isDone()) {
try{
Thread.sleep(1000L);
}catch (Exception e) {
Log.e("", e.getMessage());
}
if(transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error)) {
Log.e("ERROR!!! ", transfer.getError() + "");
}
if(transfer.getException() != null) {
transfer.getException().printStackTrace();
Log.e("not null", "print stack success");
}
}
}catch (Exception e) {
Log.e("", e.getMessage());
}
};
}.start();
}
});
}
public void sndFile(final String path, final String receiver) {
ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection);
if (sdm == null)
{
sdm = new ServiceDiscoveryManager(connection);
Log.e("service discovery", "SDM");
sdm.addFeature("http://jabber.org/protocol/disco#info");
sdm.addFeature("jabber:iq:privacy");
}
FileTransferManager manager = new FileTransferManager(connection);
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(receiver+"/Smack");
File file = new File(path);
try {
transfer.sendFile(file, "test_file");
} catch (XMPPException e) {
e.printStackTrace();
}
while(!transfer.isDone()) {
if(transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error)) {
System.out.println("ERROR!!! " + transfer.getError());
Log.e("while status error", "error");
} else if (transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.refused)
|| transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.cancelled)) {
System.out.println("Cancelled!!! " + transfer.getError());
Log.e("while Cancelled", "cancel refuse");
}
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.refused) || transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error)
|| transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.cancelled)){
System.out.println("refused cancelled error " + transfer.getError());
Log.e("if cancelled", "refused cancel");
} else {
System.out.println("Success");
Log.e("if no error", "Success");
j=0;
arrList_messages.add("File "+transfer.getFileName()+"Sent");
arrList_messages.add(" ");
setListAdapter();
setListAdapterGreen();
}
}
我的 LogCat 发送时:
07-12 12:45:47.330: W/IInputConnectionWrapper(22548): showStatusIcon on inactive InputConnection
07-12 12:45:57.511: I/Path:(22548): /mnt/sdcard/Pictures/Screenshots/Screenshot_2013-07-08-13-08-57.png
07-12 12:45:57.514: I/Started(22548): Applicationtrue
07-12 12:45:57.515: I/Resumed(22548): Applicationtrue
07-12 12:45:59.560: W/System.err(22548): java.lang.InterruptedException
07-12 12:45:59.561: W/System.err(22548): at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1198)
07-12 12:45:59.561: W/System.err(22548): at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:311)
07-12 12:45:59.561: W/System.err(22548): at java.util.concurrent.ArrayBlockingQueue.put(ArrayBlockingQueue.java:292)
07-12 12:45:59.561: W/System.err(22548): at org.jivesoftware.smack.PacketWriter.sendPacket(PacketWriter.java:97)
07-12 12:45:59.561: W/System.err(22548): at org.jivesoftware.smack.XMPPConnection.sendPacket(XMPPConnection.java:488)
07-12 12:45:59.561: W/System.err(22548): at org.jivesoftware.smackx.filetransfer.Socks5TransferNegotiator.negotiateIncomingStream(Socks5TransferNegotiator.java:130)
07-12 12:45:59.562: W/System.err(22548): at org.jivesoftware.smackx.filetransfer.FaultTolerantNegotiator$NegotiatorService.call(FaultTolerantNegotiator.java:181)
07-12 12:45:59.562: W/System.err(22548): at org.jivesoftware.smackx.filetransfer.FaultTolerantNegotiator$NegotiatorService.call(FaultTolerantNegotiator.java:166)
07-12 12:45:59.562: W/System.err(22548): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-12 12:45:59.562: W/System.err(22548): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-12 12:45:59.562: W/System.err(22548): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
07-12 12:45:59.562: W/System.err(22548): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-12 12:45:59.562: W/System.err(22548): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-12 12:45:59.562: W/System.err(22548): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-12 12:45:59.562: W/System.err(22548): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-12 12:45:59.562: W/System.err(22548): at java.lang.Thread.run(Thread.java:856)
接收时我的 LogCat:
06-19 11:22:41.912: W/System.err(15386): java.util.concurrent.ExecutionException:
06-19 11:22:41.912: W/System.err(15386): -- caused by: No response from remote client:
06-19 11:22:41.913: W/System.err(15386): at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:233)
06-19 11:22:41.913: W/System.err(15386): at java.util.concurrent.FutureTask.get(FutureTask.java:90)
06-19 11:22:41.913: W/System.err(15386): at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.negotiateStream(IncomingFileTransfer.java:193)
06-19 11:22:41.913: W/System.err(15386): at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.access$100(IncomingFileTransfer.java:47)
06-19 11:22:41.913: W/System.err(15386): at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$1.run(IncomingFileTransfer.java:124)
06-19 11:22:41.913: W/System.err(15386): at java.lang.Thread.run(Thread.java:856)
06-19 11:22:41.913: W/System.err(15386): -- caused by: No response from remote client:
06-19 11:22:41.914: W/System.err(15386): at org.jivesoftware.smackx.filetransfer.FaultTolerantNegotiator.createIncomingStream(FaultTolerantNegotiator.java:113)
06-19 11:22:41.914: W/System.err(15386): at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$2.call(IncomingFileTransfer.java:186)
06-19 11:22:41.914: W/System.err(15386): at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$2.call(IncomingFileTransfer.java:183)
06-19 11:22:41.914: W/System.err(15386): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-19 11:22:41.914: W/System.err(15386): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-19 11:22:41.914: W/System.err(15386): at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.negotiateStream(IncomingFileTransfer.java:190)
06-19 11:22:41.914: W/System.err(15386): ... 3 more
06-19 11:22:41.914: E/not null(15386): print stack success
06-19 11:22:41.914: E/ERROR!!!(15386): null