2013-03-14 53 views
3

我正在開發一個聊天應用程序,我需要在對等聊天用戶之間發送圖像。現在我能夠發送圖像,我的文件接收器也接受請求並開始接收文件。Android aSmack XMPP文件傳輸總是顯示進行中和狀態0

但打印狀態始終保持印刷: LOG:進展:0.0 &況:正在

和精加工線後 - LOG ###文件傳輸不完整。現況:正在

如果我讓這個線程運行刪除指望它continuesly保持印刷 - 進展:0.0 &況:正在

有時全圖像後收到..這需要很長的時間,很多次的一半或大小爲0.

private ServiceDiscoveryManager sdm;  
if (sdm == null) 
        sdm = new ServiceDiscoveryManager(connection); 
       Log.v("---fileReceive----","after discover connectin....."); 
       sdm.addFeature("http://jabber.org/protocol/disco#info"); 
       sdm.addFeature("jabber:iq:privacy"); 

       ProviderManager.getInstance().addIQProvider("query","http://jabber.org/protocol/bytestreams", new BytestreamsProvider()); 
       ProviderManager.getInstance().addIQProvider("query","http://jabber.org/protocol/disco#items", new DiscoverItemsProvider()); 
       ProviderManager.getInstance().addIQProvider("query","http://jabber.org/protocol/disco#info", new DiscoverInfoProvider()); 
       ProviderManager.getInstance().addIQProvider("si", "http://jabber.org/protocol/si", new StreamInitiationProvider()); 
       ProviderManager.getInstance().addIQProvider("query", "http://jabber.org/protocol/bytestreams", new BytestreamsProvider());      
       ProviderManager.getInstance().addIQProvider("open", "http://jabber.org/protocol/ibb", new OpenIQProvider()); 
       ProviderManager.getInstance().addIQProvider("data", "http://jabber.org/protocol/ibb", new DataPacketProvider()); 
       ProviderManager.getInstance().addIQProvider("close", "http://jabber.org/protocol/ibb", new CloseIQProvider()); 
       ProviderManager.getInstance().addExtensionProvider("data", "http://jabber.org/protocol/ibb", new DataPacketProvider()); 

       sdm = ServiceDiscoveryManager.getInstanceFor(connection); 


       FileTransferNegotiator.setServiceEnabled(connection, true); 
       FileTransferNegotiator.IBB_ONLY = true; 
       manager = new FileTransferManager(connection); 
       // Create the listener 
       // fListner=new FileTransferListener() { 
       manager.addFileTransferListener(new FileTransferListener() { 
        @Override 
        public void fileTransferRequest(FileTransferRequest request) { 
         // TODO Auto-generated method stub 
         Log.v("----Recieve File", 
           "new file transfere requesttttt------------"); 

         Log.v("-----file request","from" + request.getRequestor()); 

         // Accept it 

         try { 
          IncomingFileTransfer transfer = request.accept(); 
          Log.v("----transfer--","accepted"); 

          double percents = 0.0; 
          int currentCycle = 0; 
          transfer.recieveFile(new File(Environment.getExternalStorageDirectory().getPath()+"/"+transfer.getFileName())); 


           while(!transfer.isDone() && currentCycle < 100) { 
            if(transfer.getStatus().equals(Status.in_progress)) { 
             percents = ((int) (transfer.getProgress()*10000))/100.0; 
                //percents is 100.0 after 1 cycle 
             Log.i(LOG, "Filetransfer Progress: "+percents + " Status: "+transfer.getStatus().toString()); 
            } else if (transfer.getStatus().equals(Status.error)) { 
             Log.e(LOG, "FileTransfer ERROR"+transfer.getError().getMessage()); 
             break; 
            } 
            currentCycle ++; 
            try { 
             Thread.sleep(1000); 
            } catch (InterruptedException e) { 
             e.printStackTrace(); 
            } 
           } 

           if(transfer.getStatus().equals(Status.complete)) { 
            if (onFileReceivedListener != null) { 
             onFileReceivedListener.onFileReceived(transfer); 
            } 
           }else{ 
            Log.e(LOG, "###Filetransfer not complete. Status:" + transfer.getStatus().toString()); 
                 //FILE IS HERE 
           } 
         } catch (XMPPException e) { 
          e.printStackTrace(); 
         } 
        } 
       }); ` 

任何提示或幫助表示讚賞。

+0

你使用什麼聊天服務器? – 2013-03-14 13:03:53

+0

這不是一個真正的答案,而是一個很好的起點:https://github.com/Flowdalic/asmack/wiki/aSmack-XMPP-File-Transfer – Flow 2013-03-15 20:01:45

+0

@Vyoma你有沒有完成這項任務? – 2015-01-30 07:49:39

回答

0

最近我確實對asmack和smackx有一點經驗,對他們也不太肯定。

我不確切地知道你的問題來自哪裏,但我可以告訴你這是正常的。在任何進度實際開始之前,您將首先獲得進度負荷= 0。 如果它是一個你發送的小文件,它會發送得很快,以至於沒有任何真正的進展。

但是,如果您成功發送更大的文件,此功能確實工作得很好,並會帶給您粗糙的進展。

最後,我們得出結論,這個功能只是爲了解決漏洞和限制,並且實現了我們自己的文件傳輸xmpp消息並通過我們自己的服務器處理它。如此,您還可以將文件發送給羣組(MUC)中的離線用戶,並在雙方都顯示正常進度(發送&接收)。

+0

感謝你的回覆。實際上,現在我的大小爲6.71 kb的圖像。並且配備了自己的服務器。如果我可以得到任何問題,你可以分享你的工作代碼嗎?從我身邊。 – Vyoma 2013-03-14 11:51:14

+0

對不起,工作代碼不見了,我想,因爲我們已經改變它使用我們自己的服務器。然而,就像我說的,嘗試使用幾MB的圖片。 6kb發送得太快。 – 2013-03-14 12:35:23

+0

我試過mbs的圖像,但正如我所說的在接收機端的任何圖像,它顯示圖像大小爲0.這意味着它已保存但未完全接收。 – Vyoma 2013-03-15 04:57:17