如何在 Android 的 Smack 中接收文件?
Posted
技术标签:
【中文标题】如何在 Android 的 Smack 中接收文件?【英文标题】:How to receive files in Smack in Android? 【发布时间】:2013-05-11 08:13:22 【问题描述】:如何在 android 中使用 Smack 和 Openserver 接收传输的文件?以下是我用来接收文件的代码。但出现错误,无法录制任何文件。
ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection);
if(sdm == null)
sdm = new ServiceDiscoveryManager(connection);
sdm.addFeature("http://jabber.org/protocol/disco#info");
sdm.addFeature("http://jabber.org/protocol/disco#item");
sdm.addFeature("jabber:iq:privacy");
XMPPConnection.DEBUG_ENABLED = true;
FileTransferManager manager=new FileTransferManager(connection);
FileTransferNegotiator.setServiceEnabled(connection, true);
manager.addFileTransferListener(new FileTransferListener()
@Override
public void fileTransferRequest(final FileTransferRequest request)
Log.i("Recieve File","new file transfere request new file transfere request new file transfere request");
Log.i("file request","from" + request.getRequestor());
// TODO Auto-generated method stub
new Thread()
@Override
public void run()
IncomingFileTransfer transfer = request.accept();
File mf = Environment.getExternalStorageDirectory();
File file = new File(mf.getAbsoluteFile()+"/DCIM/Camera/" + transfer.getFileName());
try
System.out.println("<====== Receives ======>");
transfer.recieveFile(file);
while (!transfer.isDone()|| (transfer.getProgress() < 1))
Thread.sleep(1000);
Log.i("Recieve File alert dialog","still receiving : "+ (transfer.getProgress()) + " status " + transfer.getStatus());
if (transfer.getStatus().equals("error"))
Log.i("Recieve File alert dialog", "cancelling still receiving : "+ (transfer.getProgress())+ " status "+ transfer.getStatus());
transfer.cancel();
break;
catch (Exception e)
Log.e("", e.getMessage());
.start();
);
发送文件时出现以下错误。
02:48:58 PM RCV (1079277904): <iq type="error" id="6gQg0-6" to="admin-pc/cc4dd310" from="2222222222@admin-pc/Smack"><si xmlns="http://jabber.org/protocol/si" id="jsi_3030055238839806007" profile="http://jabber.org/protocol/si/profile/file-transfer"><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="sdcard"><desc>test</desc></file><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns="jabber:x:data" type="form"><field var="stream-method" type="list-single"><option><value>http://jabber.org/protocol/bytestreams</value></option><option><value>http://jabber.org/protocol/ibb</value></option></field></x></feature></si><error code="405" type="cancel"><not-allowed xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>
【问题讨论】:
您使用的是哪个版本的 smack? 3.2 中的文件传输存在一个已知问题 总是发布您遇到的错误。发布一段代码说“不起作用”可能不会为您提供任何高质量的答案。查看github.com/Flowdalic/asmack/wiki/aSmack-XMPP-File-Transfer 了解有关 aSmack 和 XMPP 文件传输的信息。 @pragneshsoni 是你的这个问题解决了,我也面临同样的问题,我什至没有得到 Log.i("Recieve File","new file transfere request new file transfere request new file transfere request" );你能帮忙解决这个问题吗? 【参考方案1】:首先,您需要使用 3.1 或 3.3 版本,因为 3.2 中有一个 known issue。然后查看此article 或this one 以获取有关对所述传输进行编码的指导。希望这会有所帮助。
【讨论】:
我不知道 Smack 3.2 的任何文件传输错误未在 3.2.1 或 3.2.2 中修复。无需回退到旧版本。 @F我已经发布了链接 此“主票证”的所有子任务在 3.2.1 或 3.2.2 中已修复,并且 SMACK-351 已在 3.3 中标记为已解决。同样,无需在旧版本上使用。 3.2.2 或 3.3 可以正常工作。以上是关于如何在 Android 的 Smack 中接收文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 的 Smack 4.2 中了解 1:1 对话中的打字状态?
我无法在 smack android 的 MessageListener 方法中接收离线消息
SmackInitialization:无法确定 Smack 版本