Android如何通过XMPP进行文件传输?

4
我只是想通过XMPP传输一个文件。我正在使用asmack库。我遇到了以下异常。
E/AndroidRuntime(  332): FATAL EXCEPTION: main
E/AndroidRuntime(  332): java.lang.NullPointerException
E/AndroidRuntime(  332):        at org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager.enableService(Socks5BytestreamManager.java:704)
E/AndroidRuntime(  332):        at org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager.activate(Socks5BytestreamManager.java:696)
E/AndroidRuntime(  332):        at org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager.getBytestreamManager(Socks5BytestreamManager.java:1
80)
E/AndroidRuntime(  332):        at org.jivesoftware.smackx.filetransfer.Socks5TransferNegotiator.<init>(Socks5TransferNegotiator.java:50)
E/AndroidRuntime(  332):        at org.jivesoftware.smackx.filetransfer.FileTransferNegotiator.<init>(FileTransferNegotiator.java:217)
E/AndroidRuntime(  332):        at org.jivesoftware.smackx.filetransfer.FileTransferNegotiator.getInstanceFor(FileTransferNegotiator.java:102)
E/AndroidRuntime(  332):        at org.jivesoftware.smackx.filetransfer.FileTransferManager.<init>(FileTransferManager.java:63)
E/AndroidRuntime(  332):        at org.apache.android.xmpp.XMPPClient.fileTransfer(XMPPClient.java:143)
E/AndroidRuntime(  332):        at org.apache.android.xmpp.XMPPClient.onClick(XMPPClient.java:200)
E/AndroidRuntime(  332):        at android.view.View.performClick(View.java:2408)
E/AndroidRuntime(  332):        at android.view.View$PerformClick.run(View.java:8816)
E/AndroidRuntime(  332):        at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(  332):        at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(  332):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  332):        at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(  332):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  332):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  332):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(  332):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

请问有人能帮我解决如何在Android中使用asmack进行文件传输的问题吗?


我在我的安卓应用程序中也遇到了同样的问题,无法在聊天中发送文件附件。你解决了这个问题吗? - sumeet
@Hitendra。你解决了你的问题吗? - Gaurav Arora
@hitendra。我已经回答了你的问题,请看一下并实现它,如果你还没有这样做的话。 - Gaurav Arora
@Hitendra,我在分享文件方面遇到了问题。您能否查看此链接,并告诉我犯了什么错误? - Android Rockss
2个回答

4
你需要制作一个虚拟的服务发现管理器。
new ServiceDiscoveryManager(your XMPP connection);

现在这行不会引起任何问题。
mFileTransferManager = new FileTransferManager(your XMPP connection);

首先,您需要将一个smack.properties文件复制到您的Android模拟器中。 您可以在原始的SMACK API网站上获取smack.properties文件。

http://www.igniterealtime.org/downloads/source.jsp

将smack.properties文件推送到"/data/"文件夹中。
修改ProviderManager.java的initialize()方法(在org/jivesoftware/smack/provider中),如下所示。
找到以下行。
        Enumeration providerEnum = classLoader.getResources(
                "/META-INF/smack.providers");

用它替换。
        Enumeration providerEnum = classLoader.getResources(
                "/data/smack.providers");

希望这可以帮助。

我正在遵循这个网站的教程。http://davanum.wordpress.com/2008/12/29/updated-xmpp-client-for-android/ 现在,我已经实现了新的ServiceDiscoveryManager(您的XMPP连接); 为此,我得到了以下异常。我在所有三个类中都找不到枚举。我正在使用asmack-jse,但我不知道版本,但我已经从code.google下载了它。 I / System.out(507):状态 :: 错误错误:: null异常::未实现功能(501) I / System.out(507):完成了吗? 真 - Hitendra
这是在编译那个教程时发生的吗? - Synxmax
是的,我刚刚按照你说的添加了一行代码:new ServiceDiscoveryManager(your XMPP connection);还有三个类,但是在这些类中我找不到枚举。 - Hitendra
安卓2.2冰淇淋三明治,你能加入任何聊天室吗? - Hitendra
@Hitendra 抱歉,我正在旅行中,只要我能尽快拿到键盘,如果你还没有解决问题,我一定会帮你解决(我在移动中)。 - Synxmax
显示剩余6条评论

2
请使用这个方法在 asmack 中进行文件传输。我已经尝试并验证了该方法,它可以完美地运行。
接收文件时,请使用这个方法。
public void ReceiveFile() {
        Thread thread = new Thread() {
            public void run() {
               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");

                // Create the file transfer manager
                final FileTransferManager managerListner = new FileTransferManager(
                        connection);

                FileTransferNegotiator
                        .setServiceEnabled(connection, true);

                Log.i("File transfere manager", "created");

                // Create the listener
                managerListner
                        .addFileTransferListener(new FileTransferListener() {
                            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());

IncomingFileTransfer transfer = request.accept();

                Log.i("Recieve File alert dialog", "accepted");
                try {


                    transfer.recieveFile(new File("/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(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 Auto-generated catch block
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                        });

            }
        };
        thread.start();
    }

如果您在使用asmack库进行XMPP文件传输时有任何问题,请随时询问我。

谢谢。


@Gaurav Arora,你能告诉我如何在Android上通过XMPP发送或接收文件吗?我在文件传输方面遇到了一些困难。 - Udit Kapahi
@UditKapahi,我已经在上面描述过了,如果您在实现相同的内容时有任何问题,请告诉我。 - Gaurav Arora
@gaurav arora:第一个问题...我的应用程序无法连接到FTP端口,即7777端口,当我将端口从5222更改后。 - Udit Kapahi
@gaurav arora:你能给我你的电子邮件地址吗?我可以在那里更好地描述我的问题。 - Udit Kapahi
1
@UditKapahi,请发送电子邮件至gaurav.arora90@gmail.com - Gaurav Arora
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接