2013-06-28 9 views

Antwort

14

Smack erhielt Unterstützung für XEP-0184 mit SMACK-331. Sie können Smack < 4.1 nicht direkt unter Android verwenden, Sie brauchen Smack 4.1 (oder höher).

Sie können mehr über Smacks XEP-0184 API im Javadoc von DeliveryReceiptManager lesen.

+0

Wenn ich asmack benutze, habe ich keine Nachrichtenbestätigung gesehen, Programme wie xabber, sollte ich xep-0184 in asmack aktivieren? Und wenn ich sollte, sag mir, wie ich es nicht herausfinden kann. – Mathew1990

+0

Ich habe einen Javadoc-Link hinzugefügt – Flow

+2

Jetzt funktioniert es gut, aber ich musste Empfangsbestätigung manuell so senden: \t \t Paket empfangen = neue Nachricht(); \t \t received.addExtension (neues DeliveryReceipt (packet.getPacketID())); \t \t received.setTo (packet.getFrom()); \t \t connection.sendPacket (empfangen); Ich weiß wirklich nicht warum, aber DeliveryReceiptManager erkennt nicht, dass es in xml-Lieferempfangsbestätigung gibt. DeliveryReceiptManager.hasDeliveryReceiptRequest (Paket) gibt false zurück. – Mathew1990

11

Ja, das funktioniert mit normalen Smack.

Gradle Abhängigkeiten

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 

Bereiten Sie die XMPPTCPConnection dh bevor Sie connect() verdrahten ein Handler, wenn Sie eine Übermittlungsbestätigung

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

erhalten, wenn Sie eine Nachricht senden, Stellen Sie sicher, dass Sie eine MessageReceiptRequest

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

alles getan

Jetzt können Sie sagen, wenn eine gesendete Nachricht von der anderen Seite empfangen worden ist, weil die deliveryReceiptId im Chat.sendMessage (Message) Code erhalten wird oben durch den onReceiptReceived Rückruf angemeldet sein früher eingerichtet.

+0

"Wenn Sie eine Nachricht senden, stellen Sie sicher, dass Sie eine MessageReceiptRequest einschließen" ist nicht erforderlich, da Sie automatische Empfangsbestätigungsanforderungen durch Aufrufen von 'autoAddDeliveryReceiptRequests()' aktiviert haben. – Flow

+0

behoben durch Entfernen des redundanten Aufrufs an: DeliveryReceiptManager.getInstanceFor (mConnection).autoAddDeliveryReceiptRequests(); – fr1550n

+1

Warum haben Sie ein LOC gelöscht, obwohl Sie mehrere fallen gelassen haben könnten? – Flow

Verwandte Themen