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:
- Error de aSmack: XMPPConnection es abstracta; No se puede instanciar
- Obtener usuarios en línea (entradas de la lista) usando smack 4.1 en android
- No se pueden recibir mensajes de chat en Android mediante XMPP y aSmack
- ¿Cómo obtener el historial de chat Openfire en un dispositivo Android con aSmack?
- Conexión XMPP con Smack 4.1 en Android Studio
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.
- XMPP aSmack - ¿Cómo puedo obtener el estado de usuario actual (offline / online / away / etc.)?
- ¿Cuál es la diferencia entre Smack y aSmack?
- No hay respuesta de cliente remoto: error durante la transferencia de archivos usando asmack
- Cómo habilitar el XEP-0199 en Smack?
- Cómo obtener DiscussionHistory para MultiUserChat habitación usando aSmack?
- Servicio de fondo Android para la aplicación de chat Smack (XMPP)
- ¿Cómo puedo saber si el servidor recibe un mensaje de chat?
- Las solicitudes de recibo de entrega no funcionan para XMPP Android (aSmack)
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();
- Compartir Bitmap a través de Android Intent
- java.lang.NullPointerException: Intenta invocar método de interfaz en un error de referencia de objeto nulo en OnPostExecute () – AsyncTask