2016-04-06 2 views
0

Ich bin mit dem Problem konfrontiert, Offline-Nachricht in Android-Apps mit Smack API von XMPP Mongoose Server abrufen. Wie im Code-Ablauf Versuchen Sie, die Offline-Nachricht wiederherzustellen, wenn sich der Benutzer beim xmpp mongoose Server anmeldet, bevor er die verfügbare Anwesenheit an den Mungo-Server sendet.Offline-Nachricht nicht retrive von Smack API 4.1.6 von Xmpp MongooseIM Server

Mit zwei verschiedenen Möglichkeiten versucht, offline Nachricht noch nicht in der Lage, funktionierende Lösung für die gleiche zu finden. Beide Methoden, die ich alle diese Dinge ausprobiert habe, werden unten mit Details erklärt.

Below Api verwenden wir für die XMPP-Verbindung und alle anderen Nebenstelle:

// Smack (XMPP-Client-Bibliothek)

Kompilierung 'org.igniterealtime.smack: Klatschenkleks android: 4.1.6'

Kompilierung 'org.igniterealtime.smack: Klaps-tcp: 4.1.6'

Kompilierung 'org.igniterealtime.smack: Klaps-im: 4.1.6'

kompilieren 'org.igniterealtime.smack: Klaps-android-Erweiterungen: 4.1.6'

Versuchte retrive offline Nachricht Mit offlineMessageManager

Im Folgenden finden Sie Code, die ich versucht offline Nachricht nach dem Login abrufen und vor verfügbar Präsenz Server

try {

Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval (mit);

Iterator i = (Iterator) offlineMessageManager.getMessages();

while (i.hasNext())

{Nachricht msg = i.next(); System.out.println ("Habe Text [" + msg.getBody() + "] aus [" + msg.getFrom() + "]");

} catch (XMPPException e)

{System.out.println ("Error Offline-Meldung."); e.printStackTrace(); }

catch (SmackException.NotConnectedException e)

{System.out.println ("Error Offline-Meldung Keine Verbindung."); e.printStackTrace(); }

catch (SmackException.NoResponseException e)

{System.out.println ("Error Offline-Meldung Nr Reponse."); e.printStackTrace(); }

Ausgabe Fall 1:

Im Folgenden finden Sie Detail Ausnahme, die, wenn sie über Code

I Exception

ausführen erzeugen bekam, wenn sie unter Codezeile auszuführen.

Iterator i = (Iterator) offlineMessageManager.getMessages();

Im Folgenden finden Sie Beschreibung Ausnahme, die, wenn sie über Leitung generieren

org.jivesoftware.smack.XMPPException $ XMPPErrorException ausführen: XMPPError: service-unavailable -

Ausgabe Fall 2 Abbrechen:

Wenn Überprüfung ist Flexible Offline-Nachricht von Android-Code mit Smack von Xmmp Mungo-Server unterstützt, so habe ich falschen Wert. Unten ist Code, den ich zum Testen benutzt habe.

Boolesch isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval();

Ausgabe Fall 3:

Wenn ich versuche, unterstützt Funktionen wie unter Verwendung von unten Methode Klaps Code abzurufen.

ServiceDiscoveryManager Manager = ServiceDiscoveryManager

.getInstanceFor (Verbindung);

Liste AllFetures = Manager.getFeatures();

Im Folgenden finden Sie Features-Liste, die ich retrived:

http://jabber.org/protocol/bytestreams,

Jabber: iq: Privatsphäre, urn: xmpp: ping,

http://jabber.org/protocol/commands,

Jabber: iq: version,

jabber: iq: last,

http://jabber.org/protocol/xdata-validate,

http://jabber.org/protocol/xhtml-im,

V-Card-temp,

http://jabber.org/protocol/chatstates,

urn: xmpp: Quittungen, urn: xmpp: Zeit,

http://jabber.org/protocol/xdata-layout,

http://jabber.org/protocol/muc ,

http://jabber.org/protocol/disco#items,

http://jabber.org/protocol/disco#info,

http://jabber.org/protocol/caps,

Jabber: x: data

Versuchte offline Nachricht Hörer Mit Paket von XMPP MongooseIM

unten an retreive ist Code Ich habe versucht, mit Paket-Listener von Smack API 4.1.6.

private statische endgültige StanzaFilter MESSAGE_PACKET_FILTER = neue OrFilter (StanzaTypeFilter.MESSAGE);

Konfiguration = XMPPTCPConnectionConfiguration.builder()

  .setServiceName(SERVICE_NAME) 

      .setHost(KDevelopmentXMPPServer) 

      .setPort(PORT) 

      .setSendPresence(false) 

      .build(); 

// erzeuge Connection-Objekt von xmpp Verbindung mit konfigurierter Detail

Verbindung = new XMPPTCPConnection (Konfiguration);

connection.addAsyncStanzaListener (neu StanzaListener() {

  @Override 

      public void processPacket(Stanza packet) throws SmackException.NotConnectedException { 


       Log.d("CheckPacket", "OfflineMEssage"); 


       Message message = (Message) packet; 

       if (message != null) { 

        if (message.getBody() != null) { 



         Log.i("XMPPClient", "Got text [" + message.getBody() 

           + "] from [" + message.getFrom() + "]"); 



        } 

       } 



      } 

     }, MESSAGE_PACKET_FILTER); 

connection.login (Benutzer, Passwort);

Vielen Dank im Voraus, mir bitte jemand für die besten helfen Lösung für mein kritische Thema zu arbeiten.

+0

Sind Sie sicher, dass offline Nachricht Unterstützung (Modul mod_offline) in der Instanz von MongooseIM aktiviert? Es scheint nicht so. – erszcz

+0

Hi erszcz, Ja, es ist möglich. In unseren iOS-Apps funktioniert das. aber Problem ist nur Android mit Smack API. –

+0

Es würde Ihnen helfen, den Verkehr auf der XML-XMPP-Ebene zu überprüfen. Sie würden sehen, was Sie genau an Ihren Server senden und was der Server antwortet. –

Antwort

0

Das Problem besteht darin, Offline-Nachrichten vor Senden der ersten Anwesenheit zu versuchen.XEP-0160 Staaten:

When the recipient next sends non-negative available presence to the server, the server delivers the message to the resource that has sent that presence. [...]

MongooseIM arbeitet mit entsprechend dieser Empfehlung.

Sie haben bereits darauf hingewiesen, was von isFlexibleRetrievalSupport signalisiert wird - der Server unterstützt nicht flexible Offline-Nachrichtenabruf.

+0

Ja, der Server unterstützt keinen flexiblen Abruf von Offline-Nachrichten. Deshalb ist offlineMessagemager nicht in der Lage Offline-Nachrichten abzurufen. ** Gibt es eine andere Möglichkeit Offline-Nachrichten mit smack api 4.1.6 in Android zu erhalten, wenn der Server diese flexible Offline-Nachrichtenabfrage nicht unterstützt? ** –

+0

Wie ich in der Antwort oben gesagt habe: Der Server sendet die Offline-Nachrichten erst NACH dem Senden der ersten Anwesenheit. Senden Sie die erste Anwesenheit und Sie erhalten die Nachrichten. – erszcz

+0

@KavitaMevada Irgendwelche Fortschritte bis jetzt? – erszcz

0

Ich weiß, dass ich dies zu spät schreibe, aber wenn jemand wie mich, die für gleiche Abfrage ist auf der Jagd nach „wie zu speichern und zu archivieren Nachrichten in Android-App zu bekommen“ diese Antwort verweisen:

Note : this is implemented in the lastest version

Requrirements :

  1. lastest openfire as of now 4.1.4
  2. install Archives plugin in openfire
MamManager mamManager = MamManager.getInstanceFor(connection); 
    boolean isSupported = mamManager.isSupportedByServer(); 
    if (isSupported) { 
     MamManager.MamQueryResult mamQueryResult = mamManager.queryArchive(500); 
     List<Forwarded> forwardedMessages = mamQueryResult.forwardedMessages; 
     Forwarded d = forwardedMessages.get(0); 
    } 

Bitte beachten: Documention for MamManager Class

+0

Ich bekomme diese Ausnahme 'XMPPError: feature-not-implemented - cancel', irgendeine Idee, was ist das Problem? –

+0

@ADM du musst die ploign in opoen fire hinzufügen –

Verwandte Themen