我刚刚从折旧的asmack切换到Smack 4.1。Smack 4.1自动发送带有错误id的收据,这在我的情况下导致异常。
Smack 4.1用收据附加两个不同的id
以下是聊天消息收到的消息
RECV (0): <message from='***' to='***' xml:lang='en' id='65' kind='0' type='chat'><body>vhh</body><request xmlns='urn:xmpp:receipts'/></message>以下是Smack4.1响应聊天消息生成的接收收据
SENT (0): <message to='***' id='roZ7C-32' type='chat'><received xmlns='urn:xmpp:receipts' id='65'/></message>Smack 4.1使用接收到的 id='roZ7C-32'和id='65'附加两个不同的id。
我的问题是:
发布于 2016-01-27 07:59:39
对于第一个问题,要获取发送消息的ID,代码如下:
Message ms = new Message();
ms.addBody("EN", Messegeforsend);
DeliveryReceiptRequest.addTo(ms); //tells that you will need delivery for this message
String send_message_id= ms.getStanzaId();您可以获得传递消息的ID,这与发送的消息的ID相同:
deliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(connection);
deliveryReceiptManager.addReceiptReceivedListener(new ReceiptReceivedListener() {
@Override
public void onReceiptReceived(String arg0, String arg1, String arg2,Stanza arg3) {
String delivered_message_id = arg2;
}});
send_message_id将与delivered_message_id完全相等,因此您将知道已经传递了哪条消息
发布于 2016-02-03 03:52:23
SMACK 4.1.0消息接收监听器以编写以下代码
try {
Message ms = new Message();
ms.addBody("EN", "deleriyed");
ms.setTo(message.getFrom());
ms.setStanzaId(message.getStanzaId());
DeliveryReceiptRequest.addTo(ms);
connection.sendStanza(ms);
} catch (NotConnectedException e) {
e.printStackTrace();
}发布于 2019-06-21 14:12:28
禁用此功能的方法就是在发送邮件时不向消息添加收据:
最重要的方法是
processPacketExtension
//Creating message in your method
public sendMessage(Jid to, String body){
Message msg = Message(to, body);
//Create and save your deliveryID to SQLite database
deliveryID = DeliveryReceiptRequest.addTo(msg);
ChatManager.getInstanceFor(connection).chatWith(jid).send(msg);
}
//Declare your stanza listener
private MessagePacketListener messagePacketListener;
//In your cotnructor
messagePacketListener = new MessagePacketListener(context);
//Then in your login method register your stanza listener like this
public void login() throws SmackInvocationException, XmppStringprepException {
connect();
try {
if (!con.isAuthenticated()) {
....
con.addSyncStanzaListener(messagePacketListener, new StanzaTypeFilter(Message.class));
....
}
} catch(Exception e) {
....
}
}
//Your StanzaListener where you parse your incoming message and if it is without body it is Delivery receipt
//Now you have your MessagePacketListener that process the incoming messages
public class MessagePacketListener implements StanzaListener{
private Context context;
MessagePacketListener(Context context) {
this.context = context;
}
@Override
public void processStanza(Stanza packet) {
Message msg = (Message)packet;
//Message that have body
if(msg.getBodies().size() > 0){
//Text message
//Do something with message msg.getBody()
}
else{
//This must be sth like delivery receipt or Chat state msg and get your deliveryID
processPacketExtension(msg);
}
}
//processPacketExtension method that receive packet delivery ectension
private void processPacketExtension(Message msg) {
Collection<ExtensionElement> extensions = msg.getExtensions();
if (extensions != null) {
Iterator<ExtensionElement> iterator = extensions.iterator();
if (iterator.hasNext()) {
ExtensionElement extension = iterator.next();
if(extension instanceof DeliveryReceipt){
//Do sth with deliveryID
String deliveryID = ((DeliveryReceipt) extension).getId();
}
}
}
}
}https://stackoverflow.com/questions/30124626
复制相似问题