2013-06-28 4 views
6

こんにちはメッセージを取得することができますアンドロイドのXMPPクライアントを行うにはどのような方法がある私はXEP-0184がピシャリであることを読まなく、通常ピシャリはアンドロイドで動作していない(または私はできません確認(XEP-0184)を受信それは)常にSASL認証の例外があります。SmackでXMPP XEP-0184「メッセージ配信確認書」を使用するにはどうすればよいですか?

答えて

14

スマックはSMACK-331でXEP-0184のサポートを受けました。スマート< 4.1をAndroidのすぐ下に使用することはできません。スマック4.1(またはそれ以上)が必要です。

あなたはDeliveryReceiptManagerのjavadocの中スマックのXEP-0184 APIの詳細を読むことができます。

+0

私はxabberのようなメッセージ確認私のプログラムを見ていないasmackを使用する場合、私はasmackにXEP-0184を有効にする必要がありますか?そしてもし私がそうしなければ、どうやってそれを見つけられないのか教えてください。 – Mathew1990

+0

私は今、それが正常に動作javadocのリンク – Flow

+2

を追加したが、私はそのように手動で確認を受信送信する必要がありました: \t \t受信したパケット=新しいMessage(); \t \t received.addExtension(new DeliveryReceipt(packet.getPacketID())); \t \t received.setTo(packet.getFrom()); \t \t connection.sendPacket(received); 私は本当に理由はわかりませんが、DeliveryReceiptManagerはxml配信確認要求があることを検出しません。 DeliveryReceiptManager.hasDeliveryReceiptRequest(packet)はfalseを返します。 – Mathew1990

11

はいこれは通常のスマックで動作します。

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は、上記Chat.sendMessage(メッセージ)コードにして得られたので、送信されたメッセージは、他の側で受信した場合に知ることができonReceiptReceivedコールバックによって記録されます以前に設定した

+0

'autoAddDeliveryReceiptRequests()'を呼び出すことによって自動配信確認要求を有効にしたので、「メッセージを送信するときは必ずMessageReceiptRequestをインクルードする」という必要はありません。 – Flow

+0

は、DeliveryReceiptManager.getInstanceFor(mConnection)への冗長な呼び出しを削除することで修正されました。autoAddDeliveryReceiptRequests(); – fr1550n

+1

なぜ複数のLOCを落とすことができたときに1つのLOCを落としましたか? – Flow