【问题标题】:Sending inline images using Smack XMPP使用 Smack XMPP 发送内联图像
【发布时间】:2014-03-08 16:31:17
【问题描述】:

我即将创建一个简单的 xmpp java 客户端应用程序,为此我正在考虑使用 Smack XMPP 库,它运行良好。

客户端的一个功能应该是将内联图像发送给您的聊天伙伴。 我浏览了 SMACK 的 javadoc,但找不到如何使用 SMACK/XMPP 发送图像或一般二进制数据。我不是在谈论接收用户必须接受的标准文件传输,而是可以在消息中发送的图像。这对 SMACK/XMPP 可行吗?谁能举个例子?

【问题讨论】:

    标签: java xmpp smack instant-messaging


    【解决方案1】:

    您可以通过使用 smth 来使其默认接受(不会提示用户):

    final FileTransferManager manager = new FileTransferManager(connection); //Use your xmpp connection
    manager.addFileTransferListener(new FileTransferListener() {
        public void fileTransferRequest(FileTransferRequest request) {
                IncomingFileTransfer transfer = request.accept();
                try {
                    InputStream input = transfer.recieveFile();
                    //This will be a binary stream and you can process it. Create image and display it inline in your chat app.
                } catch (XMPPException e) {
                    e.printStackTrace();
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      你可以试试这个链接:https://www.javacodegeeks.com/2012/08/android-file-transfer-with-asmack-and.html

      用于文件发送

      FileTransferManager manager = new FileTransferManager(connection);
      OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer('usre2@myHost/Smack');
      File file = new File(filenameWithPath);
      try {
         transfer.sendFile(file, 'test_file');
           } catch (XMPPException e) {
             e.printStackTrace();
      }
      while(!transfer.isDone()) {
         if(transfer.getStatus().equals(Status.error)) {
            System.out.println('ERROR!!! ' + transfer.getError());
         } else if (transfer.getStatus().equals(Status.cancelled)
                          || transfer.getStatus().equals(Status.refused)) {
            System.out.println('Cancelled!!! ' + transfer.getError());
         }
         try {
            Thread.sleep(1000L);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
      if(transfer.getStatus().equals(Status.refused) || transfer.getStatus().equals(Status.error)
       || transfer.getStatus().equals(Status.cancelled)){
         System.out.println('refused cancelled error ' + transfer.getError());
      } else {
         System.out.println('Success');
      }
      

      文件接收:

      FileTransferManager manager = new FileTransferManager(connection);
      manager.addFileTransferListener(new FileTransferListener() {
         public void fileTransferRequest(final FileTransferRequest request) {
            new Thread(){
               @Override
               public void run() {
                  IncomingFileTransfer transfer = request.accept();
                  File mf = Environment.getExternalStorageDirectory();
                  File file = new File(mf.getAbsoluteFile()+'/DCIM/Camera/' + transfer.getFileName());
                  try{
                      transfer.recieveFile(file);
                      while(!transfer.isDone()) {
                         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();
                         }
                      }
                   }catch (Exception e) {
                      Log.e('', e.getMessage());
                  }
               };
             }.start();
          }
       });
      

      【讨论】:

        【解决方案3】:

        你可以试试这个:

        public boolean sendFiles(XMPPConnection con,String fullJID,String filePath){  
            File files=new File(filePath);  
            FileTransferManager fileManager=new FileTransferManager(con);  
            OutgoingFileTransfer sendfile=fileManager.createOutgoingFileTransfer(fullJID);  
            try {  
                sendfile.sendFile(files, "Sending file");  
                return true;  
            } catch (XMPPException e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
        
        public void receiveFiles(XMPPConnection con,final String filePath){  
            FileTransferManager fileManager=new FileTransferManager(con);  
            fileManager.addFileTransferListener(new FileTransferListener() {  
                @Override  
                public void fileTransferRequest(FileTransferRequest prequest) {  
                    //System.out.println("The file received from: " + prequest.getRequestor());  
                    System.out.println("filePath:"+filePath+"||FileName:"+prequest.getFileName());  
                    file = new File(filePath +"\\" +prequest.getFileName());  
                    request = prequest;  
                    IncomingFileTransfer infiletransfer =request.accept();  
                    try {  
                        infiletransfer.recieveFile(file);  
                        System.out.println("success!");  
                    } catch (XMPPException e) {  
                        e.printStackTrace();  
                    }  
                }  
            });  
        }  
        

        【讨论】:

          猜你喜欢
          • 2011-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-11
          • 1970-01-01
          • 2011-05-30
          • 2016-09-30
          相关资源
          最近更新 更多