Activar la gestión de corrientes asmack android
Estoy enfrentando un problema con el uso de la gestión de flujo XEP-0198.
Básicamente, quiero habilitar esto para el mensaje que deja caer el problema en el androide cuando el disconect del Internet aleatoriamente y el servidor todavía tiene presencia del cliente en línea.
- Xmpp + openfire + confirmación del servidor al remitente
- Durante la transferencia de archivos usando smack en android: java.util.concurrent.ExecutionException: no hay respuesta del cliente
- ¿Cómo obtener el historial de chat Openfire en un dispositivo Android con aSmack?
- ¿Cómo aceptar la solicitud de amigos correctamente en Android smack?
- Enviar y recibir IQ XMPP ASMACK Android
Para solucionar este problema quiero usar XEP-0198 que utiliza el proceso de solicitud y reconocimiento. Puedes encontrar más aquí .
Básicamente estoy usando sm: 3 para esto. El problema es que cuando
XMPPConnection.DEBUG_ENABLED=true;
Consigo sm: 3 en el registro que es interno a asmack pero soy incapaz de conseguir eso ading cualquier packetListner sobre la conexión.
Esto es lo que dentro de asmack debug imprime:
<r xmlns='urn:xmpp:sm:3'/><message from='[email protected]/Smack' to='[email protected]' id='CQUe6-5'><received xmlns='urn:xmpp:receipts' id='CQUe6-4'/></message><r xmlns='urn:xmpp:sm:3'/>
Esto es lo que obtengo de packetFilter:
<message id="CQUe6-5" to="[email protected]" from="[email protected]/Smack"><received xmlns='urn:xmpp:receipts' id='CQUe6-4'/></message>
Había intentado para el filtro de paquete personalizado viendo el código de chat seguro y yaxim así, pero no estoy recibiendo cómo puedo obtener este <r xmlns='urn:xmpp:sm:3'/>
en mi código para que pueda Devolver el número de paquetes recibidos hasta ahora al servidor para que el servidor pueda devolverme cualquier paquete faltante.
También había configurado el gestor de proveedores para esto añadiendo el código a continuación:
addSimplePacketExtension("sm", URN_SM_3); addSimplePacketExtension("r", URN_SM_3); addSimplePacketExtension("a", URN_SM_3); addSimplePacketExtension("enabled", URN_SM_3); addSimplePacketExtension("resumed", URN_SM_3); addSimplePacketExtension("failed", URN_SM_3); private static final String URN_SM_3 = "urn:xmpp:sm:3"; private static void addSimplePacketExtension(final String name, final String namespace) { Log.e("adding simple packet extension", namespace+"---"+name); ProviderManager.getInstance().addExtensionProvider(name, namespace, new PacketExtensionProvider() { public PacketExtension parseExtension(XmlPullParser parser) throws Exception { StreamHandlingPacket packet = new StreamHandlingPacket(name, namespace); Log.e("Stream ahndling packet ","------>"+packet.toXML()); int attributeCount = parser.getAttributeCount(); for (int i = 0 ; i < attributeCount ; i++) { packet.addAttribute(parser.getAttributeName(i), parser.getAttributeValue(i)); } return (PacketExtension) packet; } }); } static class StreamHandlingPacket extends Packet { private String name; private String namespace; Map<String, String> attributes; StreamHandlingPacket(String name, String namespace) { this.name = name; this.namespace = namespace; attributes = Collections.emptyMap(); } public void addAttribute(String name, String value) { if (attributes == Collections.EMPTY_MAP) attributes = new HashMap<String, String>(); attributes.put(name, value); } public String getAttribute(String name) { return attributes.get(name); } public String getNamespace() { return namespace; } public String getElementName() { return name; } public String toXML() { StringBuilder buf = new StringBuilder(); buf.append("<").append(getElementName()); // TODO Xmlns?? if (getNamespace() != null) { buf.append(" xmlns=\"").append(getNamespace()).append("\""); } for (String key : attributes.keySet()) { buf.append(" ").append(key).append("=\"").append(StringUtils.escapeForXML(attributes.get(key))).append("\""); } buf.append("/>"); Log.e("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&","&&&&&&&&&&&&&&&&&&&&&&&&&&&&=>"+buf.toString()); return buf.toString(); } }
Básicamente tengo esta idea al ver la implementación segura de chat, pero se extiende UnkownPacket en lugar de Packet. Había tomado ayuda de aquí .
También he visto una rama git de asmack como esto, pero no fue capaz de entender cómo implementarlo.
Por favor ayuda si lo has implementado de cualquier manera con cualquier biblioteca como chat seguro, yaxim o cualquier otro cliente de Android XMPP.
- Carga de Vcards con Smack (Android) en Openfire Server
- La clase StickersManager no se encuentra para Quickblox
- Transferencia de archivos android con smack
- Uso de su propio servidor XMPP para la aplicación de chat Android (Smack API)
- Cómo utilizar Smack 4.1 en Android?
- Chat y aplicación VOIP
- (A) IQ.toXml () de Smack devuelve XML sin elementos secundarios personalizados
- La mejor manera de crear un cliente de chat Android XMPP en Unity3D
Recomiendo usar Smack 4.1, que se ejecuta en Android y admite XEP-198 Stream Management.
No puedo ofrecerle una solución porque estoy teniendo un problema similar, pero puedo decirle desde el segundo enlace que UnknownPacket extiende el paquete y implementa PacketExtension , es por eso que tuvo que emitir su StreamHandlingPacket a (PacketExtension) en la declaración de retorno de Su método parseExtension.
¿Es capaz de capturar el xml que el servidor XMPP devuelve cuando envía <enable xmlns='urn:xmpp:sm:3' etc>
? Si es así, eso sería un comienzo para su problema.
¡Déjenos saber cómo va!
El patched asmack yaxim usa se puede encontrar aquí (el creador fue muy amable de dirigirme a él, gracias Ge0rG!):
https://github.com/pfleidi/yaxim/tree/master/libs
Asegúrese de obtener libidn también.
- ¿Por qué convertir un método volátil en java?
- Deshabilitar la atenuación de fondo en ProgressDialog / AlertDialog en Android