【问题标题】:How to create listener for send and receive file using SMACK in android?如何在android中使用SMACK为发送和接收文件创建监听器?
【发布时间】:2013-05-08 06:22:32
【问题描述】:

我想在我使用 SMACK 和 Openfire 在 Android 中开发的聊天应用程序中实现文件传输功能。但是我在发送和接收文件时出错。所以任何人都可以帮我解决这个问题。谢谢前进。

下面是接收文件的代码。

ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection);
        if (sdm == null)
            sdm = new ServiceDiscoveryManager(connection);
        sdm.addFeature("http://jabber.org/protocol/disco#info");
        sdm.addFeature("jabber:iq:privacy");
        XMPPConnection.DEBUG_ENABLED = true;
        // Create the file transfer manager
        final FileTransferManager managerListner = new FileTransferManager(connection);
        FileTransferNegotiator.setServiceEnabled(connection, true);
        Log.i("File transfere manager", "created");
        managerListner.addFileTransferListener(new FileTransferListener() 
        {

            @Override
            public void fileTransferRequest(FileTransferRequest request) {
                // TODO Auto-generated method stub
                Log.i("Recieve File","new file transfere request  new file transfere request   new file transfere request");
                Log.i("file request","from" + request.getRequestor());
                IncomingFileTransfer transfer = request.accept();
                Log.i("Recieve File alert dialog", "accepted");
                try {
                    transfer.recieveFile(new File("/mnt/sdcard/" + request.getFileName()));
                    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(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error)) {
                                // Log.i("Error file",
                                // transfer.getError().getMessage());
                                    Log.i("Recieve File alert dialog",
                                        "cancelling still receiving : "
                                                + (transfer.getProgress())
                                                + " status "
                                                + transfer.getStatus());
                                    transfer.cancel();
                                    break;
                            }
                    }
                }catch (XMPPException e) {
                    // TODO: handle exception
                        e.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                        e.printStackTrace();
                }
            }    
        });

以下是我出现的错误。

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>

【问题讨论】:

    标签: android openfire asmack


    【解决方案1】:

    该错误主要是因为您错过了添加允许共享文件的提供程序管理器的配置。 请在提供程序管理器类中添加以下静态代码

    // FileTransfer
    pm.addIQProvider("si", "http://jabber.org/protocol/si",new StreamInitiationProvider());
    pm.addIQProvider("query","http://jabber.org/protocol/bytestreams",new BytestreamsProvider());
    pm.addIQProvider("open","http://jabber.org/protocol/ibb", new
             OpenIQProvider());
    pm.addIQProvider("data","http://jabber.org/protocol/ibb", new
    DataPacketProvider());
    pm.addIQProvider("close","http://jabber.org/protocol/ibb", new
             CloseIQProvider());
    pm.addExtensionProvider("data","http://jabber.org/protocol/ibb", new
             DataPacketProvider());
    

    还将以下属性添加到您的开放式服务器以启用文件共享。

    xmpp.proxy.enabled =true
    xmpp.proxy.externalip =your public ip
    xmpp.proxy.port  =7777
    

    这对你有用。

    【讨论】:

    • 你能解释一下什么是 xmpp.proxy.externalip 吗?就我而言,我将192.168.0.102:9090 设置为 externalip。可以吗?
    • 如果您的服务器是本地服务器,则 192.168.0.102 如果它托管在 Internet 上的 Web 服务器上,则为服务器的 ip。用于映射您的域名。但如果你在本地使用它,那么你就去 192.168.0.102 希望它对你有帮助。
    • 好的,非常感谢Bug帮我。
    • Hey Bug 你能给我一个代码或文件来发送和接收文件吗?谢谢
    • 我创建了一个Gist。你可以检查一下。 @pragneshsoni
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2016-02-06
    • 2016-02-14
    • 1970-01-01
    • 2013-08-27
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多