在Android中使用asmack接收文件时获取ExecutionException

时间:2014-05-05 14:50:26

标签: android xmpp asmack

我尝试使用asmack-2010.05.07.jar共享文件,我发送成功但收到ExecutionException的0kb文件。

我的发送和接收代码是:

发送文件:

private void sendFile(XMPPConnection connection) {
        configureProviderManager(connection);

        // Create the file transfer manager
        FileTransferNegotiator.setServiceEnabled(connection, true);
        //FileTransferNegotiator.IBB_ONLY = true;
        FileTransferManager manager = new FileTransferManager(connection);

        // Create the outgoing file transfer
        String toName = to + "@" + getResources().getString(R.string.service)
                + "/Smack";
        transfer = manager.createOutgoingFileTransfer(toName);
        Log.i(TAG, "send-TO:  " + toName);

        // Send the file
        try {
            File myFile = new File(PICKUP_LOC);

            if (myFile.exists()) {
                Toast.makeText(MyChat.this, "File Exist---", 1).show();
                transfer.sendFile(myFile, "You won't believe this!");
            } else {
                Toast.makeText(MyChat.this, "NOt Exist---", 1).show();
            }
        } catch (XMPPException e) {
            e.printStackTrace();
        }
new AsyncTask<Void, Void, Void>() {
            ProgressDialog pd;
            protected void onPreExecute() {
                pd = ProgressDialog.show(MyChat.this, "",
                        "Please wait..");
            }
            @Override
            protected Void doInBackground(Void... params) {
                while (!transfer.isDone()) {
                    if (transfer.getStatus().equals("Error")) {
                        System.out.println("ERROR!!! " + transfer.getError());
                    } else if (transfer.getStatus().equals("Cancelled")
                            || transfer.getStatus().equals("Refused")) {
                        System.out.println("Cancelled!!! " + transfer.getError());
                    }
                    try {
                        Thread.sleep(1000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                return null;
            };

            protected void onPostExecute(Void result) {
                pd.dismiss();
                if (transfer.getStatus().equals("Refused")
                        || transfer.getStatus().equals("Error")
                        || transfer.getStatus().equals("Cancelled")) {
                    Log.i(TAG, "refused cancelled error " + transfer.getError());

                } else {                                    
                    setMessageToList(new ChatDTO(PICKUP_LOC,
                            utilityDAO.getCurrentTime(), "1", "Me")); 
                    Log.i(TAG, "Success: "+ transfer.getFileName());
                }
            };
        }.execute();

    }

收到文件:

public void enableFileTransferListener(XMPPConnection _connection) {
if (_connection != null) {
            configureProviderManager(_connection);
            FileTransferNegotiator.setServiceEnabled(_connection, true);
           //FileTransferNegotiator.IBB_ONLY = true;                            

            FileTransferManager manager = new FileTransferManager(_connection);
            manager.addFileTransferListener(new FileTransferListener() {
                public void fileTransferRequest(
                        final FileTransferRequest request) {
                    Log.i(TAG, "in fileTransferRequest");
                    new Thread() {
                        @Override
                        public void run() {
                            IncomingFileTransfer transfer = request.accept();
                            File mf = Environment.getExternalStorageDirectory();
                            DROP_LOC = mf.getAbsoluteFile()+ "/DCIM/" + transfer.getFileName();
                            File file = new File(DROP_LOC);                         
                            try {
                                transfer.recieveFile(file);
                                while (!transfer.isDone()) {
                                    Log.i(TAG, "in While");
                                    try {
                                        Thread.sleep(1000L);
                                    } catch (Exception e) {
                                        Log.e("", e.getMessage());
                                    }
                                    if (transfer.getStatus().equals(
                                            Status.error)) {
                                        Log.e("ERROR!!! ", transfer.getError()
                                                + "");
                                    }
                                    if (transfer.getException() != null) {
                                        transfer.getException()
                                                .printStackTrace();
                                    }                                                                       
                                    } 

                                if ( !transfer.getStatus().equals("Refused")
                                        || !transfer.getStatus().equals("Error")
                                        || !transfer.getStatus().equals("Cancelled")) {

                                     runOnUiThread(new Runnable() {
                                          public void run() {
                                              setMessageToList(new ChatDTO(DROP_LOC,
                                                        utilityDAO.getCurrentTime(), "2", to
                                                                .toLowerCase()));
                                                System.out.println("Success");
                                          }
                                        });                                                                                                                                                         
                                }
                            } catch (Exception e) {
                                Log.e(TAG, e.getMessage());
                            }

                        };
                    }.start();


                }
            });
        }
    }

发送时的XMPP XML响应:

05-08 12:42:32.013: I/MyChat(3644): send-TO:  Social_66@hitchup.co.in/Smack
05-08 12:42:32.017: D/dalvikvm(3644): threadid=19: interp stack at 0x4d301000
05-08 12:42:32.025: D/dalvikvm(3644): threadid=19: calling run()
05-08 12:42:32.028: D/SMACK(3644): 12:42:32 PM SENT (1098434792): <iq id="zxsxs-29" to="Social_66@hitchup.co.in/Smack" from="social_53@hitchup.co.in/Smack" type="set"><si xmlns="http://jabber.org/protocol/si" id="jsi_6138153213036298122" mime-type="image/jpeg" profile="http://jabber.org/protocol/si/profile/file-transfer"><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="FOODS.jpg" size="65293" ><desc>You won&apos;t believe this!</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></iq>
05-08 12:42:32.047: D/ActivityThread(3644): SEND_RESULT handled : 0 / ResultData{token=android.os.BinderProxy@418468e0 results[ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://media/external/images/media/24150 }}]}
05-08 12:42:32.052: D/ActivityThread(3644): ACT-AM_ON_RESUME_CALLED ActivityRecord{41847120 token=android.os.BinderProxy@418468e0 {com.it.socialapp/com.it.socialapp.MyChat}}
05-08 12:42:33.740: D/SMACK(3644): 12:42:33 PM RCV  (1098434792): <iq id="zxsxs-29" to="social_53@hitchup.co.in/Smack" from="social_66@hitchup.co.in/Smack" type="result"><si xmlns="http://jabber.org/protocol/si"><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns="jabber:x:data" type="submit"><field var="stream-method"><value>http://jabber.org/protocol/bytestreams</value><value>http://jabber.org/protocol/ibb</value></field></x></feature></si></iq>
05-08 12:42:33.744: D/SMACK(3644): 12:42:33 PM SENT (1098434792): <iq id="zxsxs-30" to="Social_66@hitchup.co.in/Smack" type="get"><query xmlns="http://jabber.org/protocol/disco#info"></query></iq>
05-08 12:42:34.660: D/SMACK(3644): 12:42:34 PM RCV  (1098434792): <iq id="zxsxs-30" to="social_53@hitchup.co.in/Smack" type="result" from="social_66@hitchup.co.in/Smack"><query xmlns="http://jabber.org/protocol/disco#info"><identity category="client" name="Smack" type="pc"/><feature var="jabber:iq:privacy"/><feature var="http://jabber.org/protocol/si/profile/file-transfer"/><feature var="http://jabber.org/protocol/disco#items"/><feature var="http://jabber.org/protocol/ibb"/><feature var="http://jabber.org/protocol/si"/><feature var="http://jabber.org/protocol/bytestreams"/><feature var="http://jabber.org/protocol/disco#info"/></query></iq>
05-08 12:42:34.663: D/SMACK(3644): 12:42:34 PM SENT (1098434792): <iq id="zxsxs-31" to="hitchup.co.in" type="get"><query xmlns="http://jabber.org/protocol/disco#items"></query></iq>
05-08 12:42:35.070: D/SMACK(3644): 12:42:35 PM RCV  (1098434792): <iq type="result" id="zxsxs-31" from="hitchup.co.in" to="social_53@hitchup.co.in/Smack"><query xmlns="http://jabber.org/protocol/disco#items"><item jid="search.hitchup.co.in" name="User Search"/><item jid="pubsub.hitchup.co.in" name="Publish-Subscribe service"/><item jid="sipark.hitchup.co.in" name="SIP Controller"/><item jid="broadcast.hitchup.co.in" name="Broadcast service"/><item jid="proxy.hitchup.co.in" name="Socks 5 Bytestreams Proxy"/><item jid="logger.hitchup.co.in" name="Remote Logger"/><item jid="conference.hitchup.co.in" name="Public Chatrooms"/></query></iq>
05-08 12:42:35.073: D/SMACK(3644): 12:42:35 PM SENT (1098434792): <iq id="zxsxs-32" to="proxy.hitchup.co.in" type="get"><query xmlns="http://jabber.org/protocol/disco#info"></query></iq>
05-08 12:42:35.480: D/SMACK(3644): 12:42:35 PM RCV  (1098434792): <iq type="result" id="zxsxs-32" from="proxy.hitchup.co.in" to="social_53@hitchup.co.in/Smack"><query xmlns="http://jabber.org/protocol/disco#info"><identity category="proxy" name="SOCKS5 Bytestreams Service" type="bytestreams"/><feature var="http://jabber.org/protocol/bytestreams"/><feature var="http://jabber.org/protocol/disco#info"/></query></iq>
05-08 12:42:35.483: D/SMACK(3644): 12:42:35 PM SENT (1098434792): <iq id="zxsxs-33" to="proxy.hitchup.co.in" type="get"><query xmlns="http://jabber.org/protocol/bytestreams"/></iq>
05-08 12:42:35.890: D/SMACK(3644): 12:42:35 PM RCV  (1098434792): <iq type="result" id="zxsxs-33" from="proxy.hitchup.co.in" to="social_53@hitchup.co.in/Smack"><query xmlns="http://jabber.org/protocol/bytestreams"><streamhost jid="proxy.hitchup.co.in" host="198.57.204.44" port="7777"/></query></iq>
05-08 12:42:35.896: D/SMACK(3644): 12:42:35 PM SENT (1098434792): <iq id="zxsxs-34" to="Social_66@hitchup.co.in/Smack" type="set"><query xmlns="http://jabber.org/protocol/bytestreams" sid="jsi_6138153213036298122" mode = "tcp"><streamhost jid="social_53@hitchup.co.in/Smack" host="127.0.0.1" port="7777"/><streamhost jid="proxy.hitchup.co.in" host="198.57.204.44" port="7777"/></query></iq>
05-08 12:42:37.840: D/SMACK(3644): 12:42:37 PM RCV  (1098434792): <iq id="zxsxs-34" to="social_53@hitchup.co.in/Smack" type="result" from="social_66@hitchup.co.in/Smack"><query xmlns="http://jabber.org/protocol/bytestreams"><streamhost-used jid="proxy.hitchup.co.in"/></query></iq>
05-08 12:42:39.072: D/SMACK(3644): 12:42:39 PM SENT (1098434792): <iq id="zxsxs-35" to="Social_66@hitchup.co.in/Smack" type="set"><open xmlns="http://jabber.org/protocol/ibb" block-size="4096" sid="jsi_6138153213036298122" stanza="iq"/></iq>
05-08 12:42:39.880: D/SMACK(3644): 12:42:39 PM RCV  (1098434792): <iq id="zxsxs-35" to="social_53@hitchup.co.in/Smack" from="social_66@hitchup.co.in/Smack" type="error"><error code="501" type="CANCEL"><feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>
05-08 12:42:39.881: D/NativeCrypto(3644): Entering sslRead, caller requests to read 11 bytes timeout=0...
05-08 12:42:39.881: D/NativeCrypto(3644): Doing SSL_Read() ssl=0x13a6a38, appData=0x140bdd0
05-08 12:42:39.881: D/NativeCrypto(3644): Returned from SSL_Read() with result -1, error code 2 ssl=0x13a6a38, appData=0x140bdd0
05-08 12:42:39.881: D/NativeCrypto(3644): sslSelect type=READ fd=54 appData=0x140bdd0 timeout=0
05-08 12:42:39.881: D/dalvikvm(3644): threadid=19: exiting
05-08 12:42:39.882: D/dalvikvm(3644): threadid=19: bye!
05-08 12:42:39.882: D/dalvikvm(3644): threadid=0: freeing
05-08 12:42:40.069: I/MyChat(3644): Success: FOODS.jpg

接收时的XMPP XML响应:

05-08 12:42:31.340: D/SMACK(13479): 12:42:31 PM RCV  (1093450272): <iq id="zxsxs-29" to="social_66@hitchup.co.in/Smack" from="social_53@hitchup.co.in/Smack" type="set"><si xmlns="http://jabber.org/protocol/si" id="jsi_6138153213036298122" mime-type="image/jpeg" profile="http://jabber.org/protocol/si/profile/file-transfer"><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="FOODS.jpg" size="65293"><desc>You won't believe this!</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></iq>
05-08 12:42:31.360: I/MyChat(13479): in fileTransferRequest
05-08 12:42:31.360: I/MyChat(13479): in While
05-08 12:42:31.370: D/SMACK(13479): 12:42:31 PM SENT (1093450272): <iq id="zxsxs-29" to="social_53@hitchup.co.in/Smack" from="social_66@hitchup.co.in/Smack" type="result"><si xmlns="http://jabber.org/protocol/si"><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns="jabber:x:data" type="submit"><field var="stream-method"><value>http://jabber.org/protocol/bytestreams</value><value>http://jabber.org/protocol/ibb</value></field></x></feature></si></iq>
05-08 12:42:32.260: D/SMACK(13479): 12:42:32 PM RCV  (1093450272): <iq id="zxsxs-30" to="social_66@hitchup.co.in/Smack" type="get" from="social_53@hitchup.co.in/Smack"><query xmlns="http://jabber.org/protocol/disco#info"/></iq>
05-08 12:42:32.270: D/SMACK(13479): 12:42:32 PM SENT (1093450272): <iq id="zxsxs-30" to="social_53@hitchup.co.in/Smack" type="result"><query xmlns="http://jabber.org/protocol/disco#info"><identity category="client" name="Smack" type="pc"/><feature var="jabber:iq:privacy"/><feature var="http://jabber.org/protocol/si/profile/file-transfer"/><feature var="http://jabber.org/protocol/disco#items"/><feature var="http://jabber.org/protocol/ibb"/><feature var="http://jabber.org/protocol/si"/><feature var="http://jabber.org/protocol/bytestreams"/><feature var="http://jabber.org/protocol/disco#info"/></query></iq>
05-08 12:42:32.370: I/MyChat(13479): in While
05-08 12:42:33.370: I/MyChat(13479): in While
05-08 12:42:34.300: D/SMACK(13479): 12:42:34 PM RCV  (1093450272): <iq id="zxsxs-34" to="social_66@hitchup.co.in/Smack" type="set" from="social_53@hitchup.co.in/Smack"><query xmlns="http://jabber.org/protocol/bytestreams" sid="jsi_6138153213036298122" mode="tcp"><streamhost jid="social_53@hitchup.co.in/Smack" host="127.0.0.1" port="7777"/><streamhost jid="proxy.hitchup.co.in" host="198.57.204.44" port="7777"/></query></iq>
05-08 12:42:34.370: I/MyChat(13479): in While
05-08 12:42:35.370: I/MyChat(13479): in While
05-08 12:42:35.440: D/SMACK(13479): 12:42:35 PM SENT (1093450272): <iq id="zxsxs-34" to="social_53@hitchup.co.in/Smack" type="result"><query xmlns="http://jabber.org/protocol/bytestreams"><streamhost-used jid="proxy.hitchup.co.in" /></query></iq>
05-08 12:42:36.370: I/MyChat(13479): in While
05-08 12:42:37.370: I/MyChat(13479): in While
05-08 12:42:37.480: D/SMACK(13479): 12:42:37 PM RCV  (1093450272): <iq id="zxsxs-35" to="social_66@hitchup.co.in/Smack" type="set" from="social_53@hitchup.co.in/Smack"><open xmlns="http://jabber.org/protocol/ibb" block-size="4096" sid="jsi_6138153213036298122" stanza="iq"/></iq>
05-08 12:42:37.480: D/SMACK(13479): 12:42:37 PM SENT (1093450272): <iq id="zxsxs-35" to="social_53@hitchup.co.in/Smack" from="social_66@hitchup.co.in/Smack" type="error"><error code="501" type="CANCEL"><feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>
05-08 12:42:38.370: I/MyChat(13479): in While
05-08 12:42:39.370: I/MyChat(13479): in While
05-08 12:42:40.370: I/MyChat(13479): in While
05-08 12:42:41.370: I/MyChat(13479): in While
05-08 12:42:42.370: E/ERROR!!!(13479): null
05-08 12:42:42.370: W/System.err(13479): Error in execution: 
05-08 12:42:42.370: W/System.err(13479):   -- caused by: java.util.concurrent.ExecutionException: 
05-08 12:42:42.370: W/System.err(13479):   -- caused by: No response from remote client: 
05-08 12:42:42.370: W/System.err(13479):    at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.negotiateStream(IncomingFileTransfer.java:199)
05-08 12:42:42.370: W/System.err(13479):    at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.access$100(IncomingFileTransfer.java:47)
05-08 12:42:42.370: W/System.err(13479):    at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$1.run(IncomingFileTransfer.java:124)
05-08 12:42:42.370: W/System.err(13479):    at java.lang.Thread.run(Thread.java:856)
05-08 12:42:42.370: W/System.err(13479): Nested Exception: 
05-08 12:42:42.370: W/System.err(13479): java.util.concurrent.ExecutionException: 
05-08 12:42:42.370: W/System.err(13479):   -- caused by: No response from remote client: 
05-08 12:42:42.370: W/System.err(13479):    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:233)
05-08 12:42:42.370: W/System.err(13479):    at java.util.concurrent.FutureTask.get(FutureTask.java:90)
05-08 12:42:42.370: W/System.err(13479):    at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.negotiateStream(IncomingFileTransfer.java:193)
05-08 12:42:42.370: W/System.err(13479):    at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.access$100(IncomingFileTransfer.java:47)
05-08 12:42:42.370: W/System.err(13479):    at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$1.run(IncomingFileTransfer.java:124)
05-08 12:42:42.370: W/System.err(13479):    at java.lang.Thread.run(Thread.java:856)
05-08 12:42:42.370: W/System.err(13479): Caused by: 
05-08 12:42:42.380: W/System.err(13479):   -- caused by: No response from remote client: 
05-08 12:42:42.380: W/System.err(13479):    at org.jivesoftware.smackx.filetransfer.FaultTolerantNegotiator.createIncomingStream(FaultTolerantNegotiator.java:114)
05-08 12:42:42.380: W/System.err(13479):    at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$2.call(IncomingFileTransfer.java:186)
05-08 12:42:42.380: W/System.err(13479):    at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer$2.call(IncomingFileTransfer.java:183)
05-08 12:42:42.380: W/System.err(13479):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-08 12:42:42.380: W/System.err(13479):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-08 12:42:42.380: W/System.err(13479):    at org.jivesoftware.smackx.filetransfer.IncomingFileTransfer.negotiateStream(IncomingFileTransfer.java:190)
05-08 12:42:42.380: W/System.err(13479):    ... 3 more
05-08 12:42:42.390: I/System.out(13479): Success
05-08 12:42:42.510: D/dalvikvm(13479): GC_FOR_ALLOC freed 333K, 24% free 8541K/11207K, paused 34ms, total 36ms
05-08 12:42:42.520: I/image arrived on----->(13479): /mnt/sdcard/DCIM/FOODS.jpg

2 个答案:

答案 0 :(得分:2)

正如我们所讨论的那样here - Smack在文件传输实现方面存在一些缺陷:在你的情况下,发起者提供了bytestreamsibb方法,响应者接受两种(这是错误的)方法,下一个行程启动器提供bytestreams streamhosts,响应者选择一个,并且文件传输应该从选定的streamhost开始。但是发起人错误地启动ibb方法(原文如此!)。您可以尝试在代码中调用FileTransferNegotiator.IBB_ONLY = true;,但强烈建议您向Smack开发人员提交错误报告。

答案 1 :(得分:-1)

我认为你已经有了解决方案。

由于我严重地遇到了这个问题并找到了来自this site的解决方案,我决定在这里分享。

问题是您需要修改asmack库以增加在包org.jivesoftware.smackx.filetransfer包中的FaultTolerantNegotiator类中的createIncomingStream()方法中的超时值。

我下载了asmack-android-6-source-0.8.1.1的源代码,并根据我提供的链接修改了源代码。它就像一个魅力!