Привет, есть ли способ сделать клиенту android xmpp, который сможет получить подтверждение получения сообщения (XEP-0184). Я читал, что есть XEP-0184 в smack, но нормальный smack не работает с android (или я не могу сделайте это) всегда существует исключение аутентификации SASL.Как я могу использовать XMPP XEP-0184 «Поступления от сообщений» с помощью Smack?
ответ
Smack получил поддержку XEP-0184 с SMACK-331. Вы не можете использовать Smack < 4.1 прямо под Android, вам нужен Smack 4.1 (или выше).
Подробнее о API XEP-0184 от Smack в javadoc от DeliveryReceiptManager.
Да, это работает с нормальным 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 т.е. перед подключением() провод вверх обработчик, когда вы получите уведомление о доставке
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);
Все сделано
Теперь, вы можете сказать, когда отправлено сообщение было получено другой стороной, так как deliveryReceiptId, полученный в (Message) код Chat.sendMessage выше будет зарегистрирован в onReceiptReceived обратного вызова установленным ранее.
«При отправке сообщения убедитесь, что вы включили MessageReceiptRequest» не требуется, поскольку вы включили автоматические запросы на получение доставки, вызвав «autoAddDeliveryReceiptRequests()». – Flow
исправлено путем удаления избыточного вызова: DeliveryReceiptManager.getInstanceFor (mConnection).autoAddDeliveryReceiptRequests(); – fr1550n
Почему вы сбросили один LOC, когда можете сбросить несколько? – Flow
Когда я использую asmack, я не видел подтверждения сообщения i, таких как xabber, должен ли я включить xep-0184 в asmack? И если я должен, расскажи мне, как я не могу это узнать. – Mathew1990
Я добавил ссылку javadoc – Flow
Теперь это нормально работает, но мне пришлось отправить подтверждение подтверждения так: \t \t Пакет получен = новое сообщение(); \t \t received.addExtension (новый DeliveryReceipt (пакет.getPacketID())); \t \t получен.setTo (packet.getFrom()); \t \t подключение.sendPacket (получен); Я действительно не знаю, почему, но DeliveryReceiptManager не обнаруживает, что есть запрос на получение xml-запроса. DeliveryReceiptManager.hasDeliveryReceiptRequest (пакет) возвращает false. – Mathew1990