¿Por qué no puedo recibir mensajes MMS desde Mobile Universe E806?
Buscándolo entre la multitud, finalmente encontré un auto con apariencia y configuración razonables. Samsung i500. Pero, lamentablemente, este modelo no se ha introducido en China y todos los productos comprados en Taobao son modelos estadounidenses. No es muy problemático escribir un número, pero la imposibilidad de recibir mensajes MMS en máquinas paralelas ha sido un gran problema que ha estado afectando a muchos usuarios de máquinas paralelas.
Aunque MMS es algo del siglo pasado, todavía se utiliza con frecuencia en la vida diaria. Por ejemplo, aunque no suelo enviar mensajes MMS, a menudo recibo telegramas o mensajes MMS de otras empresas. Parte de la información en línea, como los cupones, también se envía en forma de MMS. Como función de un teléfono móvil, no importa cuándo no la necesitas, pero una vez que la usas, no puedes usarla, lo cual es muy frustrante.
Siempre he adherido al principio de la vida de que prefiero no usarla durante mil días que no usarla durante un día. . . . . .
No hace falta decir que puedes enviar mensajes MMS configurando el apn correcto, lo cual es relativamente simple. Lo siguiente habla principalmente sobre el problema de recibir mensajes MMS. 1. La razón por la cual no se puede recibir MMS
Basándonos en una gran cantidad de información en línea y después de varios días de pruebas y análisis, inicialmente encontramos la razón por la cual no se puede recibir MMS.
Según la normativa de telecomunicaciones, los mensajes MMS se envían en dos pasos. Paso 1. Envíe un mensaje corto en formato WAP-PUSH, que contenga la URL que apunta a la dirección de almacenamiento de contenido MMS. Paso 2: el teléfono móvil analiza la URL, envía una solicitud de recuperación a la URL y descarga el contenido MMS localmente para completar la recepción del MMS.
Después de enviar el MMS al teléfono móvil, no hay respuesta en el teléfono móvil, lo que indica que no se recibió la notificación MMS en el primer paso.
Escribí un receptor para interceptar el mensaje de transmisión WAP _ pushh _ del proveedor de telefonía Android en el sistema, pero no recibí esta transmisión. Demuestra que la notificación MMS no se carga en la capa de aplicación de la aplicación, entonces es posible rechazar la notificación MMS en la capa de marco.
Agregar proveedor de telefonía Android. SMS_ rechazados en el lado del receptor para recibir el mensaje emitido por el sistema. Esto indica que la notificación MMS fue efectivamente rechazada por la capa del marco.
Conclusión/sistema/marco/marco. jar, extraiga el archivo class.dex, baksmali dex y compárelo con el proceso de análisis del código fuente del sistema Android (aunque es solo una oración simple, realmente me mantuvo ocupado por un tiempo ...), y finalmente determiné que el El problema está en com. Androide. internal .phone .cdmasmsdispatcher .smali
Compare el código fuente de Android para descubrir el segmento de código clave del problema:
if (SmsEnvelope. TELESERVICE _ WAP == TELESERVICE) { return processCdmaWapPdu (SMS. get userda ta(), sms.messageRef, SMS. getoriginatingaddress());}
Copiar código
Busque el TELESERVICE_WAP correspondiente en smali y encuentre que su valor de configuración es 0x1004, convertido a 10 es 4100.
Modifique CdmaSMSDispatcher.smali para completar el TeleServiceId de la notificación SMS en color al devolver el motivo del rechazo de SMS, y descubra que TeleServiceId de Telecom es de hecho 65002, lo que también está confirmado por las especificaciones del terminal CDMA de China Telecom.
Entonces se encuentra la razón. Debido a que TeleServiceId es diferente, la ROM estadounidense que viene con el teléfono no puede reconocer el Telecom ID 65002, por lo que se niega a recibir notificaciones MMS.
2. Solución de recepción de MMS
Descubrí la razón y pensé en ese momento, esto debería ser relativamente simple. . . . . .
2.1 Modificar el Id. del servicio remoto
Busque la declaración para determinar el TeleServiceId en CdmaSMSDispatcher.smali:
Constant v10, 0x1004
Copie el código
Cambie const/160 x1004 (4100) a const 0xfdea (65002) para que pueda reconocer que se trata de un WAP-PUSH y luego llame al proceso ProcessCdmaWapPdu para procesar la PDU de la notificación MMS. .
Compile todos los archivos pequeños, actualice Classes.dex, reemplace el framework.jar local y reinicie el teléfono.
Enviando mensajes MMS con muchas ganas, he estado esperando. . . . . . por fin. . . . . . "Su terminal de teléfono móvil no admite la recepción de MMS, consígalo en mmbox.vnet.cn". . . . . .
2.2 Modificar el proceso de procesamiento de la pdu
Estoy muy frustrado. Cambié el TeleServiceId y todavía no puedo obtenerlo.
El problema debe estar en el método ProcessCdmaWapPdu. Después de un período de depuración y análisis (otra frase simple, detrás de la cual hay n horas de lucha continua y n yuanes de tarifas de envío de MMS...), finalmente se descubrió que había un problema con el análisis de la pdu.
El primer parámetro sms.getUserData() pasado por ProcessCdmaWapPdu obtiene los UserData completos que contienen el identificador de mensaje en Pdu, y el código en ProcessCdmaWapPdu procesa los parámetros entrantes de acuerdo con CHARi. Entonces los segmentos totales y los segmentos obtenidos son completamente incorrectos. El sistema piensa que la notificación MMS recibida es solo un fragmento, por lo que almacena este fragmento en la base de datos y espera los fragmentos posteriores. Pero entonces no hubo clips relevantes. . . . . .
Ahora que sabemos el motivo, no importa lo difícil que sea la solución, finalmente hay esperanza de encontrar una solución.
La solución está escrita en Java de la siguiente manera:
datos de usuario = SMS . obtener datos de usuario(); flujo de entrada bit a bit bis = flujo de entrada bit a bit 2. Saltar; (69); datos de usuario = bis . readbytearray(datos de usuario . longitud * 8-72); procesoCdmaWapPdu(datos de usuario,...)
Copiar código
En otras palabras, convierta los datos de usuario de la matriz de bytes [] en un flujo de bits, omita los primeros 69 bits (datos de encabezado), obtenga el flujo de bits (datos CHARi), descarte los últimos tres 000 bits de relleno y obtenga el flujo de bits Convertir a byte [ ] grupo de números nuevamente.
Luego, compila este código java en el código de bytes de la máquina virtual dalvik. . . . . . .
move-object/from 16v11,v10 # v10: matriz userData - longitud v 11, v 111: datos de usuario longitud nueva instancia v12, Lcom/Android/internal/invoke-direct {v12, v10} , Lcom/Android/internal/util/bitwise inputstream; - gt; ltinit gt([B]V # V 12: bis const/16 V8, 0x45 invoke-virtual {v12, v8}, Lcom/Android/internal/util/ flujo de entrada bit a bit; - gt; skip(I)V mul-int/lit 8v11, v11, 0x8 add-int/lit8 v11, v11, -0x 48 # longitud de datos de usuario * 8-72 invoke-virtual { V 12, V. 11- gt; readByteArray(I) [BMover objeto de resultado v10
Copiar código
Compilar, reemplazar, reiniciar, completar
Después, estaba un poco confundido Solución Este conjunto de códigos originales es utilizado por la versión estadounidense de la ROM. ¿Los mensajes MMS enviados por los operadores CDMA imperialistas estadounidenses verifican directamente los datos del encabezado? no pueden recibir los mensajes MMS. El Imperio Americano lo respondió nosotros mismos. No liberemos a las personas empobrecidas y oprimidas.
Recibir y enviar mensajes MMS automáticamente. /p>
He terminado de recibir mensajes MMS. , y ahora no tengo problemas para enviar y recibir mensajes MMS, pero todavía hay un pequeño inconveniente, que es que necesitas conectarte manualmente a 3G para enviar y recibir mensajes MMS, y no puedes enviar y recibir mensajes MMS automáticamente. p>
A excepción de mí, perfeccionista, también me gusta este tipo de trabajo de modificación y estoy agotado
Después de un tiempo, la investigación no es muy larga, mucho más corta que. La investigación anterior sobre la recepción de MMS), descubrió que al enviar y recibir mensajes MMS, el sistema se conectará automáticamente a la red 3G y luego iniciará otra línea para enviar y recibir mensajes MMS.
Pero el problema clave. La razón es que la conexión de red 3G lleva tiempo. Cuando el cliente de acceso telefónico ppp todavía está intercambiando paquetes de datos con el servidor para confirmar la relación, el hilo para enviar y recibir MMS ya ha comenzado a funcionar, por supuesto, al conectarse al MMSC. 10.0.0.200, será rechazado. Luego el programa arroja una excepción io y las transacciones de envío y recepción se marcan como fallidas. Finalmente, el sistema desconecta la conexión 3G. Intentar enviar y recibir mensajes MMS simplemente fue eliminado.
3.2 Solución
Ahora que conocemos la causa, la solución es solo cuestión de tiempo. Hay muchas soluciones. Utilicé el método para garantizar routetohost frente a los métodos getPdu y sendPdu. También modifiqué el método para garantizar routetohost y agregué un bucle con un tiempo de espera de salida para determinar el valor de requestRouteToHost.
Si 3G aún no está conectado, inténtelo nuevamente después de dormir (1000) hasta que se determine a partir del enrutamiento que 3G ha establecido exitosamente una conexión, salga de sureRouteToHost e ingrese al proceso de envío y recepción de mensajes MMS.
Si la conexión 3G no se establece correctamente en 60 segundos (ya sea por mala señal o por retrasos...), se lanzará una excepción io, notificando al sistema que no se pueden enviar ni recibir mensajes MMS. y el sistema ingresará automáticamente al programa integrado Reintentar el programa.
Este bucle es más problemático de escribir, por lo que en lugar de escribir java, escriba el código de bytes dalvik directamente:
const/16 v10, 0x3c: cond_4 add-int/lit 8v10, v 10 , -0x1 if-eqz v10, :cond_5 invoke-virtual {v0, v7, v1}, land roid/net/connectivity manager - gt; requestRouteToHost(II)Z move-result v4 if-nez v4, :cond _ 3 const-wide v 11, 0x3e 8 invoke-static { v 11, v12}, Ljava/lang/Thread; - gt; sleep(J) V ir a: condición 4: condición 5
Copiar código