如何在 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 版本

使用 Smack Api for Android 发送和接收消息

Smack Android,创建一个接收消息的服务

android端怎么接收openfire服务器发送过来的消息