2013-06-28 1 views
6

Привет, есть ли способ сделать клиенту android xmpp, который сможет получить подтверждение получения сообщения (XEP-0184). Я читал, что есть XEP-0184 в smack, но нормальный smack не работает с android (или я не могу сделайте это) всегда существует исключение аутентификации SASL.Как я могу использовать XMPP XEP-0184 «Поступления от сообщений» с помощью Smack?

ответ

14

Smack получил поддержку XEP-0184 с SMACK-331. Вы не можете использовать Smack < 4.1 прямо под Android, вам нужен Smack 4.1 (или выше).

Подробнее о API XEP-0184 от Smack в javadoc от DeliveryReceiptManager.

+0

Когда я использую asmack, я не видел подтверждения сообщения i, таких как xabber, должен ли я включить xep-0184 в asmack? И если я должен, расскажи мне, как я не могу это узнать. – Mathew1990

+0

Я добавил ссылку javadoc – Flow

+2

Теперь это нормально работает, но мне пришлось отправить подтверждение подтверждения так: \t \t Пакет получен = новое сообщение(); \t \t received.addExtension (новый DeliveryReceipt (пакет.getPacketID())); \t \t получен.setTo (packet.getFrom()); \t \t подключение.sendPacket (получен); Я действительно не знаю, почему, но DeliveryReceiptManager не обнаруживает, что есть запрос на получение xml-запроса. DeliveryReceiptManager.hasDeliveryReceiptRequest (пакет) возвращает false. – Mathew1990

11

Да, это работает с нормальным 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 обратного вызова установленным ранее.

+0

«При отправке сообщения убедитесь, что вы включили MessageReceiptRequest» не требуется, поскольку вы включили автоматические запросы на получение доставки, вызвав «autoAddDeliveryReceiptRequests()». – Flow

+0

исправлено путем удаления избыточного вызова: DeliveryReceiptManager.getInstanceFor (mConnection).autoAddDeliveryReceiptRequests(); – fr1550n

+1

Почему вы сбросили один LOC, когда можете сбросить несколько? – Flow