2015-07-22 45 views
8

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

所以任何一个人都可以请给我这样做的方式。

目前,我得到的文本消息,并添加到列表视图,就像下面,

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毫克=新FileTransferManager(Constants.connection);

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

那么,我怎样才能访问我的课文件类?

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

请尽快帮助我。

在此先感谢。

回答

3

尝试此链接:reference

对于文件发送

FileTransferManager manager = new FileTransferManager(connection); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer('[email protected]/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(); 
    } 
}); 
+0

hello @ kiturk3我知道这段代码,但如何访问如果** FileTransferManager **有一个私人访问,我明确提到我的问题。 –

+2

此界面已更改。您现在必须调用FileTransferManager.getInstance(Connection) –

+0

我的文件不发送。 我得到System.out.println('拒绝取消错误'+ transfer.getError()); 你能告诉我应该是什么原因 – Rajat

1

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

FileTransferManager ftm = FileTransferManager.getInstanceFor(connection)

请参阅此链接FileTransferManager了。

希望这可以帮助你。

+0

根据文档链接FileTransferManager使用EntityFullJid。这是否意味着它也可以发送到房间? – Killer

+0

@Killer我还没有尝试过这种方法。但似乎这个'FileTransferManager'适用于1对1的方法。您可以尝试检查此链接[带外数据](https://xmpp.org/extensions/xep-0066.html) – Joey

相关问题