通过xmpp在android中进行文件传输?

通过xmpp在android中进行文件传输?,android,xmpp,smack,Android,Xmpp,Smack,我正试图通过xmpp传输一个文件。我正在使用asmack lib。我在下面遇到异常 E/AndroidRuntime( 332): FATAL EXCEPTION: main E/AndroidRuntime( 332): java.lang.NullPointerException E/AndroidRuntime( 332): at org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager.ena

我正试图通过xmpp传输一个文件。我正在使用asmack lib。我在下面遇到异常

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)
E/AndroidRuntime(332):致命异常:main
E/AndroidRuntime(332):java.lang.NullPointerException
E/AndroidRuntime(332):位于org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager.enableService(Socks5BytestreamManager.java:704)
E/AndroidRuntime(332):位于org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager.activate(Socks5BytestreamManager.java:696)
E/AndroidRuntime(332):位于org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager.getbytestreammager(Socks5BytestreamManager.java:1
80)
E/AndroidRuntime(332):位于org.jivesoftware.smackx.filetransfer.socks5transfercongregator(socks5transfercongregator.java:50)
E/AndroidRuntime(332):位于org.jivesoftware.smackx.filetransfer.filetransfercongregator.(filetransfercongregator.java:217)
E/AndroidRuntime(332):位于org.jivesoftware.smackx.filetransfer.filetransfercongregator.getInstanceFor(filetransfercongregator.java:102)
E/AndroidRuntime(332):位于org.jivesoftware.smackx.filetransfer.FileTransferManager.(FileTransferManager.java:63)
E/AndroidRuntime(332):位于org.apache.android.xmpp.XMPPClient.fileTransfer(XMPPClient.java:143)
E/AndroidRuntime(332):位于org.apache.android.xmpp.XMPPClient.onClick(XMPPClient.java:200)
E/AndroidRuntime(332):在android.view.view.performClick(view.java:2408)
E/AndroidRuntime(332):在android.view.view$PerformClick.run(view.java:8816)
E/AndroidRuntime(332):位于android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(332):位于android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(332):位于android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(332):位于android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(332):位于java.lang.reflect.Method.Invokenactive(本机方法)
E/AndroidRuntime(332):位于java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(332):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(332):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

有谁能帮我在android中如何使用asmack进行文件传输吗?

你必须制作一个虚拟服务发现管理器

new ServiceDiscoveryManager(your XMPP connection);
现在这条线没有引起任何问题

mFileTransferManager = new FileTransferManager(your XMPP connection);
首先,您必须将smack.properties复制到android仿真器。 您可以在原始smack API站点上获得
smack.properties

将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");

希望获得此帮助

请在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();
    }
public void ReceiveFile(){
线程线程=新线程(){
公开募捐{
ServiceDiscoveryManager sdm=ServiceDiscoveryManager
.getInstanceFor(连接);
如果(sdm==null)
sdm=新的ServiceDiscoveryManager(连接);
sdm.addFeature(“http://jabber.org/protocol/disco#info");
sdm.addFeature(“jabber:iq:privacy”);
//创建文件传输管理器
final FileTransferManager Manager列表=新建FileTransferManager(
连接);
文件传递谈判者
.setServiceEnabled(连接,true);
Log.i(“文件传输管理器”、“已创建”);
//创建侦听器
经理人投资者
.addFileTransferListener(新的FileTransferListener(){
公共无效文件传输请求(
最终文件传输请求){
Log.i(“接收文件”,
“新文件传送请求新文件传送请求新文件传送请求”);
Log.i(“文件请求”,
“from”+request.getRequestor());
IncomingFileTransfer=request.accept();
Log.i(“接收文件警报对话框”、“接受”);
试一试{
transfer.receivefile(新文件(“/sdcard/”)
+request.getFileName());
而(!transfer.isDone()| |(transfer.getProgress()<1)){
睡眠(1000);
Log.i(“接收文件警报对话框”,“仍在接收:”
+(transfer.getProgress())+“状态”
+transfer.getStatus());
if(transfer.getStatus().equals(Status.error)){
//Log.i(“错误文件”,
//transfer.getError().getMessage());
Log.i(“接收文件警报对话框”,
“取消仍在接收:”
+(transfer.getProgress())
+“地位”
+transfer.getStatus());
transfer.cancel();
打破
}
}
}捕获(XMPPException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 普林斯特