【问题标题】:android how to send and receive image and location (using map ) in group chat using xmpp-smackandroid如何使用xmpp-smack在群聊中发送和接收图像和位置(使用地图)
【发布时间】:2015-10-11 20:17:33
【问题描述】:

我使用 android-xmpp 开发群聊应用程序,因为我不知道如何发送和接收图片或位置(使用地图)。

所以任何人都可以请给我做这些的方法。

目前,我收到短信并添加到列表视图,如下所示,

Message msg = new Message(to, Message.Type.groupchat);
msg.setBody(text);
if (Constants.connection != null) {
    try {
        Constants.connection.sendPacket(msg);
        Log.d("Send to room  : Name : ", to);
        Log.d("store", "store data to db");
        //DBAdapter.addUserData(new UserData(text, "", "1" ,beam_id));
    } catch (Exception e) {
        Log.d("ooo", "msg exception" + e.getMessage());
    }

    messages.add(text);

    runOnUiThread(new Runnable() {
        public void run() {
           // set to listview
            setMyChatAdapter();
        }
    });
}

并使用 StanzaTypeFilter 接收。那么如何进行图像和位置共享呢?

我尝试使用 FileTransferManager 使用 smack-extensions-4.1.3-sources.jar 来跟踪图像代码。

 private void sendImage()
 {

  FileTransferManager mg=new FileTransferManager(Constants.connection);
  OutgoingFileTransfer transfer = mg.createOutgoingFileTransfer(beam_id+"@"+Constants.conference_name + "/" + Constants.resources);
  File file = new File(selectedImagePath);
  try {
      transfer.sendFile(file, "test_file");
  } catch (Exception e) {
      e.printStackTrace();
  }
  while(!transfer.isDone()) {
      if(transfer.getStatus().equals(FileTransfer.Status.error)) {
          System.out.println("ERROR!!! " + transfer.getError());
      } else if (transfer.getStatus().equals(FileTransfer.Status.cancelled)
              || transfer.getStatus().equals(FileTransfer.Status.refused)) {
          System.out.println("Cancelled!!! "+ transfer.getError());
      }
      try {
          Thread.sleep(1000L);
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
  }
  if(transfer.getStatus().equals(FileTransfer.Status.refused) || transfer.getStatus().equals(FileTransfer.Status.error)
          || transfer.getStatus().equals(FileTransfer.Status.cancelled)){
      System.out.println("refused cancelled error"+ transfer.getError());
   } else {
      System.out.println("Success");
   }
} 

但是当我使用以下访问该文件时,

FileTransferManager mg=new FileTransferManager(Constants.connection);

它给我错误...有一个私有访问...所以,我发现该文件的构造函数是私有的,这是 jar 文件,所以我不能将其更改为公共。

那么,我怎样才能将该文件类访问到我的类中?

那么,我如何在聊天中分享(发送-接收)图像和位置信息?

请尽快帮助我。

提前致谢。

【问题讨论】:

    标签: android tcp connection xmpp file-transfer


    【解决方案1】:

    试试这个链接:reference

    用于文件发送

    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();
        }
     });
    

    【讨论】:

    • 你好@kiturk3 我知道这段代码,但是如果 FileTransferManager 有私人访问权限,我在我的问题中明确提到了如何访问。
    • 此界面已更改。您现在必须调用 FileTransferManager.getInstance(Connection)
    • 我的文件没有发送。我得到了 System.out.println('拒绝取消错误' + transfer.getError());你能告诉我应该是什么原因吗
    • @Rajat 权限正常吗?
    【解决方案2】:

    FileTransferManager 类有getInstanceFor(XMPPConnection connection) 来获取FileTransferManager 的实例。只需提供一个有效的 XMPPConnecton。例如

    FileTransferManager ftm = FileTransferManager.getInstanceFor(connection)

    也可以查看此链接FileTransferManager

    希望对你有所帮助。

    【讨论】:

    • 根据文档链接 FileTransferManager 使用 EntityFullJid。这是否意味着它也可以发送到房间?
    • @Killer 我没有尝试过这种方法。但似乎这个FileTransferManager 适用于一对一的方法。您可以尝试检查此链接Out of Band Data
    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 2017-08-11
    • 1970-01-01
    • 2016-01-01
    • 2016-12-23
    • 2017-04-04
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多