7

嗨,有什么方法可以做 android xmpp 客户端,它将能够获得消息接收确认(XEP-0184)我读到 smack 中有 XEP-0184 但正常的 smack 不适用于 android(或者我不能这样做) 总是存在 SASL 身份验证异常。

4

2 回答 2

15

Smack 通过SMACK-331获得了对 XEP-0184 的支持。您不能在 Android 下直接使用 Smack < 4.1,您需要 Smack 4.1(或更高版本)。

您可以在DeliveryReceiptManager的 javadoc 中阅读有关 Smack 的 XEP-0184 API 的更多信息。

于 2013-06-28T19:01:28.553 回答
12

是的,这适用于普通的 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 回调记录。

于 2016-04-08T23:26:50.060 回答