Obtener mensajes sin conexión en la aplicación de chat de Android con el uso de la biblioteca asmack

Estoy usando la biblioteca asmack para mi aplicación de chat. Estoy usando el código descrito a continuación para obtener messagecount:

ServiceDiscoveryManager manager = ServiceDiscoveryManager.getInstanceFor(connection); DiscoverInfo info = manager.discoverInfo(null,"http://jabber.org/protocol/offline"); Form extendedInfo = Form.getFormFrom(info); if (extendedInfo != null) { String value = extendedInfo.getField("number_of_messages").getValues().next(); Log.e(TAG, "offline message"+value); } 

Pero tengo la excepción como se describe a continuación:

 09-14 16:11:32.892: ERROR/AndroidRuntime(498): at com.datingapps.breaktheice.SigninScreen.coonectToChat(SigninScreen.java:393) 09-14 16:35:20.611: WARN/System.err(538): java.lang.ClassCastException: org.jivesoftware.smack.util.PacketParserUtils$2 09-14 16:35:20.811: WARN/System.err(538): at org.jivesoftware.smackx.ServiceDiscoveryManager.discoverInfo(ServiceDiscoveryManager.java:608) 09-14 16:35:20.811: WARN/System.err(538): at com.datingapps.breaktheice.Chat$connectionTask.doInBackground(Chat.java:286) 09-14 16:35:20.811: WARN/System.err(538): at com.datingapps.breaktheice.Chat$connectionTask.doInBackground(Chat.java:1) 09-14 16:35:20.811: WARN/System.err(538): at android.os.AsyncTask$2.call(AsyncTask.java:185) 09-14 16:35:20.811: WARN/System.err(538): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 09-14 16:35:20.821: WARN/System.err(538): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 09-14 16:35:20.821: WARN/System.err(538): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 09-14 16:35:20.821: WARN/System.err(538): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 09-14 16:35:20.821: WARN/System.err(538): at java.lang.Thread.run(Thread.java:1096) 

Cualquiera que lo haya implementado con asmack o tenga una solución alternativa con smack lib, Por favor, ayúdame a salir de este problema.

Después de buscar y buscar en la documentación, Todo lo que tengo que offlinemanager para obtener mensajes fuera de línea.

Sin embargo, no está funcionando en asmack o puede estar en smack.It siempre devolver 0 mensaje.

Finalmente, al ver los registros que encontré que cada empate cuando inicio de sesión i obtuvo mucha respuesta de servidor de chat que también contiene mensajes fuera de línea, pero con etiqueta de mensaje no etiqueta de mensaje fuera de línea.Así que encontré finalmente

Usted puede conseguir mensajes fuera de línea de él fijando directamente el oyente del paquete después de apenas conexión. Como i debajo del oyente descrito del paquete usted tiene que poner en práctica después del método de la conexión.

  PacketFilter filter = new MessageTypeFilter(Message.Type.chat); this.connection.addPacketListener(new PacketListener() { public void processPacket(Packet packet) { Message message = (Message) packet; if (message.getBody() != null) { String fromName = StringUtils.parseBareAddress(message .getFrom()); Log.i("XMPPClient", "Got text [" + message.getBody() + "] from [" + fromName + "]"); if (fromName.equalsIgnoreCase(matchUserJabberId + "server name")) { // } } } } }, filter); 

Espero que ayude a muchos a encontrar un trabajo alrededor para el mensaje fuera de línea temprano como i invertido más tiempo para sacarlo.

Reemplace su código con esto. He utilizado este código está funcionando bien.

 public int offlinemessagecount(){ try { ServiceDiscoveryManager manager = ServiceDiscoveryManager .getInstanceFor(connection); DiscoverInfo info = manager.discoverInfo(null, "http://jabber.org/protocol/offline"); Form extendedInfo = Form.getFormFrom(info); if (extendedInfo != null) { String value = extendedInfo.getField("number_of_messages") .getValues().next(); return Integer.parseInt(value); } } catch (Exception e) { e.printStackTrace(); } return 0; } 

GTalkSMS es un buen ejemplo para cada operación básica con Asmack lib , a continuación se muestra el pequeño código de ejemplo que tomé del proyecto GTalkSMS para obtener mensajes sin conexión.

 public static void handleOfflineMessages(XMPPConnection connection, Context ctx)throws Exception { OfflineMessageManager offlineMessageManager = new OfflineMessageManager(connection); if (!offlineMessageManager.supportsFlexibleRetrieval()) { Log.d("Offline messages not supported"); return; } if (offlineMessageManager.getMessageCount() == 0) { Log.d("No offline messages found on server"); } else { List<Message> msgs = offlineMessageManager.getMessages(); for (Message msg : msgs) { String fullJid = msg.getFrom(); String bareJid = StringUtils.parseBareAddress(fullJid); String messageBody = msg.getBody(); if (messageBody != null) { Log.d("Retrieved offline message from " +messageBody); } } offlineMessageManager.deleteMessages(); } } 

Intenta reemplazar tu código con esto.

 ProviderManager mgr = ProviderManager.getInstance(); mgr.addExtensionProvider(offline, http://jabber.org/protocol/offline, org.jivesoftware.smackx.packet.OfflineMessageInfo$Provider); mgr.addIQProvider(offline, http://jabber.org/protocol/offline, org.jivesoftware.smackx.packet.OfflineMessageRequest$Provider); OfflineMessageManager offMgr = new OfflineMessageManager(connection); int numOffline = offMgr.getMessageCount(); 

¿Apenas comprobando, usted configuró sus abastecedores del smack?

Antes de establecer la conexión, se debe llamar

 SmackAndroid.init(mContext); // this loads extension providers into aSmack try { conn.connect(); } catch (XMPPException e) { e.printStackTrace(); // do something } 

Sin llamar a esto, definitivamente obtendrá

Sólo utilice OfflineMessageManager, si no desea obtener automáticamente los mensajes sin conexión (XEP-0013).

De lo contrario, simplemente añada su StanzaListener a la conexión y el inicio de sesión.

  XMPPTCPConnectionConfiguration userBasicConfiguration = XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() .setServiceName(SERVICE_NAME) .setHost(HOST_NAME) .setDebuggerEnabled(false) .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) .setPort(PORT) .setUsernameAndPassword(userName, password) .build(); AbstractXMPPConnection firstUserConnection = new XMPPTCPConnection(userBasicConfiguration); firstUserConnection.connect(); StanzaFilter filter = new StanzaTypeFilter(Message.class); StanzaListener listener = stanza -> { System.out.println(stanza.toString()); }; firstUserConnection.addSyncStanzaListener(listener,filter); firstUserConnection.login(); while (!Thread.currentThread().isInterrupted()){ } firstUserConnection.disconnect(); 
  • No puedo obtener mensajes sin conexión usando asmack api para la aplicación Gtalk
  • El oyente de presencia no trabaja en asmack
  • ¿Cómo implementar el estado de lectura de mensajes como whatsapp blue tick mark?
  • Mensajes perdidos con aSmack
  • Cómo recibir mensajes sin usar createChat para android XMPP chat smack api
  • ¿Cómo aceptar la solicitud de amigos correctamente en Android smack?
  • Inhibición de inicio de sesión La autenticación SASL falló al utilizar el mecanismo DIGEST-MD5 asmack en android
  • ASmack - ¿Dónde obtener ChatManager?
  • Activar la gestión de corrientes asmack android
  • Código de error 503 en la transferencia de archivos mediante xmpp
  • ¿Cómo obtener la marca de tiempo del mensaje xmpp entrante?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.