2013-06-28 46 views

回答

14

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

您可以在DeliveryReceiptManager的javadoc中閱讀更多關於Smack的XEP-0184 API。

+0

當我使用asmack時,我沒有看到消息確認程序,如xabber,我應該在asmack中啓用xep-0184嗎?如果我應該告訴我我怎麼能找不到它。 – Mathew1990

+0

我已添加javadoc鏈接 – Flow

+2

現在它工作正常,但我不得不手動發送接收確認如下: \t \t Packet received = new Message(); \t \t received.addExtension(new DeliveryReceipt(packet.getPacketID())); \t \t received.setTo(packet.getFrom()); \t \t connection.sendPacket(received); 我真的不知道爲什麼,但DeliveryReceiptManager沒有檢測到有XML傳遞收據請求。 DeliveryReceiptManager.hasDeliveryReceiptRequest(數據包)返回false。 – Mathew1990

11

是的這適用於普通的Smack。

搖籃依賴

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); 

全部完成

現在,你可以知道什麼時候已經被對方收到發送消息,因爲在Chat.sendMessage(消息)代碼獲得deliveryReceiptId以上將被onReceiptReceived回調記錄早些時候設置。

+0

「發送消息時確保包含MessageReceiptRequest」不是必需的,因爲您通過調用'autoAddDeliveryReceiptRequests()'來啓用自動傳遞收據請求。 – Flow

+0

通過刪除冗餘調用來修復:DeliveryReceiptManager.getInstanceFor(mConnection)。autoAddDeliveryReceiptRequests(); – fr1550n

+1

爲什麼當你放棄多重時,你會放棄一個LOC? – Flow