Messaggi XMPP persi su Android durante la commutazione di connettività dati (ad esempio trasformando Wifi di GSM, <-> Wifi switch)

Sto sviluppando un'applicazione di chat in android. Utilizzo del server XMPP. Il server PHP è stato migrato in ejabber.

La mia notifica funziona correttamente in tutti gli scenari. Ma in un caso sto perdendo i messaggi XMPP. Infatti non ricevo notifiche.

  • Accesso a AutoFocus / Flash con Google Vision BarCode Reader
  • Android - Crash quando si fa clic su RecyclerView quando il caricamento di SwipeRefreshLayout
  • Android - Il SimpleCursorAdapter consente più layout come BaseAdapter?
  • Qualsiasi alternativa a CachingHttpClient per Android?
  • Ottieni il calendario degli utenti utilizzando OutlookClient
  • android locationManager requestLocationUpdates
  • In dettaglio, disattivo la connessione WiFi o la connessione dati. e dopo aver distriggersto la connessione WiFi o la connessione di qualsiasi notifica inviata a me che non sta ottenendo. dopo quando accendo la connessione WiFi o la connessione dati, non riesco a ricevere i messaggi inviati a me.

    Ho implementato il servizio in background. che rende sempre connessione la connessione xmpp.

    Ottengo questo errore mentre disattivo la connessione WiFi.

    java.net.SocketException: sendto failed: EPIPE (Broken pipe) java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out) at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506) at libcore.io.IoBridge.sendto(IoBridge.java:475) at java.net.PlainSocketImpl.write(PlainSocketImpl.java:508) at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46) at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:270) at java.io.OutputStreamWriter.flushBytes(OutputStreamWriter.java:167) at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:158) at java.io.BufferedWriter.flush(BufferedWriter.java:124) at org.jivesoftware.smack.PacketWriter.writePackets(PacketWriter.java:286) at org.jivesoftware.smack.PacketWriter.access$12(PacketWriter.java:270) at org.jivesoftware.smack.PacketWriter$1.run(PacketWriter.java:137) Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe) at libcore.io.Posix.sendtoBytes(Native Method) at libcore.io.Posix.sendto(Posix.java:146) at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177) at libcore.io.IoBridge.sendto(IoBridge.java:473) ... 9 more at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:552) at libcore.io.IoBridge.recvfrom(IoBridge.java:516) at java.net.PlainSocketImpl.read(PlainSocketImpl.java:489) at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241) at java.io.InputStreamReader.read(InputStreamReader.java:244) at java.io.BufferedReader.read(BufferedReader.java:310) at org.jivesoftware.smack.XMPPConnection$AliveReader.read(XMPPConnection.java:1122) at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1496) at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:979) at org.kxml2.io.KXmlParser.next(KXmlParser.java:346) at org.kxml2.io.KXmlParser.next(KXmlParser.java:310) at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:321) at org.jivesoftware.smack.PacketReader.access$1(PacketReader.java:216) at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:70) Caused by: libcore.io.ErrnoException: recvfrom failed: ETIMEDOUT (Connection timed out) at libcore.io.Posix.recvfromBytes(Native Method) at libcore.io.Posix.recvfrom(Posix.java:131) at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164) at libcore.io.IoBridge.recvfrom(IoBridge.java:513) ... 13 more 

  • get il nome di path da Uri Android Lollipop
  • La voce dell'elenco diventa incautabile se contiene un RatingBar?
  • Cattura l'image automaticamente come 360 ​​Panorama
  • Android: centro gridview orizzontalmente
  • Funzione Android Affinity Spiegazione
  • Differenza tra RequestParams add () e put () in AndroidAsyncHttp
  • 5 Solutions collect form web for “Messaggi XMPP persi su Android durante la commutazione di connettività dati (ad esempio trasformando Wifi di GSM, <-> Wifi switch)”

    Quindi per installare mod_archive ho bisogno di fare questo, il tipico: Scrivi la row successiva in cmd. (Per centesimi)

    Accesso come root Crea una nuova directory:

     mkdir ejabberd_archive_plugin cd ejabberd_archive_plugin 

    ottieni ora gli ultimi moduli ejabberd utilizzando il seguente command

     yum https://svn.process-one.net/ejabberd-modules cd ejabberd-modules/mod_archive/trunk ./build.sh 

    Ora vai alla directory ebin usando cmd e ottieni l'elenco di tutti i file * .beam per i plugin di archivi ejabberd.

     root@ns1 [/ejabberd_archive_plugin/ejabberd-modules/mod_archive/trunk/ebin]# ls –l 

    Utilizzando i seguenti cmd riceverai tutti i file di ejabberd * .beam quando si installa e configura ejabberd.

     root@ns1 [/usr/lib64/ejabberd/ebin]# ls -l 

    Ora copiate tutti i file * .beam (archivia plugin) nella directory ejabberd ebin utilizzando il seguente cmd

     root@ns1 [/]# cp /ejabberd_archive_plugin/ejabberd-modules/mod_archive/trunk/ebin /usr/lib64/ejabberd/ebin 

    Ora vai all'URL seguente e copia tutte le query di tabella sql e si esegue in phpmyadmin (database ejabberd)

     https://svn.process-one.net/ejabberd-modules/mod_archive/trunk/src/mod_archive_odbc_mysql.sql 

    Ora configurare ejjaberd.cfg utilizzando il seguente cmd

     root@ns1 [/etc/ejabberd]# vi ejabberd.cfg Add the following line into ejabberd.cfg file in modules configuration section {mod_archive_odbc, [{database_type, "mysql"}, {default_auto_save, true}, {enforce_default_auto_save, true}]}, 

    Ora riavviare il servizio ejabberd.

     root@ns1 [/etc/ejabberd]# sudo service ejabberd restart 

    È necessario disporre di "Stream Management" XEP-198 abilitati per get questo risultato. Georg ha scritto una buona voce sul blog su questo argomento: http://op-co.de/blog/posts/XEP-0198/ In sostanza consente di riconoscere la stanza e di riprendere il stream , cosa che è esattamente ciò che si desidera fare in caso di es. un interruttore Wifi <-> GSM.

    Concludo dalla stacktrace che stai usando aSmack (che è Smack portto ad Android). Esiste una richiesta di funzionalità aperta per implementare Stream Management in Smack: SMACK-333 . Infatti, ho recentemente iniziato a lavorare sull'implementazione, ma non posso nominare un ETA.

    Devi creare il servizio web separato per questo. per cui possiamo gestire la storia del messaggio inviato. possiamo gestire il messaggio offline.

    XEP-198 è l'unica soluzione. fare il plugin per il tuo server e rendere facile gestire il messaggio rimanente che si perde. ci può essere un'altra soluzione, ma AFAIK, questa sarebbe la soluzione.

    è ansible modificare il plugin di archivio per salvare gli ID dei messaggi in esso.

    Quando l'utente viene in linea call un servizio web con l'ultimo messaggio ricevuto. il server può get tutti i messaggi successivi salvati sul server. Lo ho creato allo stesso modo e funzionavo perfettamente.

    Dovresti fare il giro dopo la riconnessione a Internet each volta. Ma tenere presente che se si relogna con la stessa risorsa e lo stesso utente, anche se è in linea, il server farà passare l'errore di stream (sostituito da una nuova connessione) che ti farà in linea e non riceverai alcun messaggio. Per questo, scollegatelo prima prima di relogin. Prova a cercare il module Mod Amp .

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.