【发布时间】:2013-06-26 13:39:13
【问题描述】:
嗨,有什么方法可以做 android xmpp 客户端,它将能够获得消息接收确认 (XEP-0184) 我读到 smack 中有 XEP-0184 但正常的 smack 不适用于 android(或者我可以' t 这样做)总是有 SASL 身份验证异常。
【问题讨论】:
嗨,有什么方法可以做 android xmpp 客户端,它将能够获得消息接收确认 (XEP-0184) 我读到 smack 中有 XEP-0184 但正常的 smack 不适用于 android(或者我可以' t 这样做)总是有 SASL 身份验证异常。
【问题讨论】:
Smack 通过SMACK-331 获得了对 XEP-0184 的支持。 Android下不能直接使用Smack
您可以在DeliveryReceiptManager 的 javadoc 中阅读有关 Smack 的 XEP-0184 API 的更多信息。
【讨论】:
DeliveryReceiptManager .getInstanceFor(mXMPPConnection) .enableAutoReceipts(); - 这也将确保创建了一个经理并绑定到连接。
DeliveryReceiptManager.getInstanceFor(connection).autoAddDeliveryReceiptRequests();
是的,这适用于普通 Smack。
Gradle 依赖项
compile "org.igniterealtime.smack:smack-android:4.1.0"
compile "org.igniterealtime.smack:smack-tcp:4.1.0"
compile "org.igniterealtime.smack:smack-extensions:4.1.0" // <-- XEP-0184 classes
准备好 XMPPTCPConnection,即在你 connect() 之前连接一个处理程序,以便你收到一个交货收据
DeliveryReceiptManager.getInstanceFor(mConnection).addReceiptReceivedListener(new ReceiptReceivedListener() {
@Override
public void onReceiptReceived(String fromJid, String toJid, String deliveryReceiptId, Stanza stanza) {
Log.d(TAG, "onReceiptReceived: from: " + fromJid + " to: " + toJid + " deliveryReceiptId: " + deliveryReceiptId + " stanza: " + stanza);
}
});
发送消息时,请确保包含 MessageReceiptRequest
Chat chat;
if (StringUtils.isNullOrEmpty(threadId)) {
chat = getChatManager().createChat(to);
Log.d(TAG, "sendMessage: no thread id so created Chat with id: " + chat.getThreadID());
} else {
chat = getChatManager().getThreadChat(threadId);
Log.d(TAG, "sendMessage: thread id was used to continue this chat");
}
Message message = new Message(to);
message.addBody("EN", messageText);
String deliveryReceiptId = DeliveryReceiptRequest.addTo(message);
chat.sendMessage(message);
Log.d(TAG, "sendMessage: deliveryReceiptId for this message is: " + deliveryReceiptId);
全部完成
现在,您可以知道对方何时收到了发送的消息,因为在上面的 Chat.sendMessage(Message) 代码中获取的 deliveryReceiptId 将由之前设置的 onReceiptReceived 回调记录。
【讨论】:
autoAddDeliveryReceiptRequests() 启用了自动送达回执请求。
autoAddDeliveryReceiptRequest() 正是这样做的:它会自动向每个传出消息节添加一个送达回执请求。然后你使用DeliveryReceiptManager.addReceiptReceivedListener(ReceiptReceivedListener) 来获取收到的收据的回调。