安卓版aSmack XMPP文件传输总是显示进度和状态为0

3
我正在开发一款聊天应用程序,需要在点对点的聊天用户之间发送图片。目前我已经能够发送图片,我的文件接收器也能够接受请求并开始接收文件。
但是打印状态始终保持打印:LOG:Progress:0.0 & Status:In Progress。
在完成线程后 - LOG###文件传输未完成。状态:正在进行中。
如果我删除计数使此线程运行,则它将继续保持打印-进度: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();
                        }
                    }
                }); `

任何提示或帮助都会受到赞赏。


你使用哪个聊天服务器? - Rubycon
这并不是一个答案,而是一个很好的起点:https://github.com/Flowdalic/asmack/wiki/aSmack-XMPP-File-Transfer - Flow
@Vyoma,你完成了这个任务吗? - nawaab saab
1个回答

0

我最近有一些使用asmack和smackx的经验,对它们并不太乐观。

我不知道你的问题具体出在哪里,但我可以告诉你这是正常的。在任何进展实际开始之前,你首先会得到一个进度=0的负载。

如果你发送的是一个小文件,那么它会非常快地发送,以至于没有真正的进度。

然而,如果你成功地发送了一个较大的文件,这个功能确实很好用,并且会给你一个大致的进度。

最终我们得出结论,这个功能太过错误和有限,我们实现了自己的文件传输xmpp消息,并通过我们自己的服务器发送它。这样你也可以向离线的人发送文件,在群组(MUC)中显示合理的进度(发送和接收)。


谢谢您的回复。实际上,我现在得到了6.71 kb图像的大小为0。而且我也无法实现自己的服务器。如果我遇到任何问题,您能否分享您的工作代码给我呢? - Vyoma
很抱歉,工作代码已经丢失了,因为我们已经更改为使用自己的服务器。但是,就像我说的那样,请尝试使用几MB大小的图片。6kb发送得太快了。 - Stefan de Bruijn
我尝试了MBS的图像,但是正如我所说的,对于接收方的任何图像,它都显示图像大小为0。这意味着它已经保存,但没有完全接收。 - Vyoma

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