Detección de mensajes MMS en Android

Yo estaba buscando a través de Internet para este tema y no podía encontrar ninguna respuesta satisfactoria … Estoy tratando de detectar mensajes MMS (entrante al menos para empezar). Y he decidido pasar por la manera de detectar cambios en los contenidos. He descargado los códigos de Android y me he asegurado de que estoy utilizando el proveedor de contenido correcto: "content: // mms" (en la clase android.provider.Telephony.Mms) y estoy usando todos los permisos necesarios (desde la aplicación Mms) Hemos creado una aplicación de ejemplo que detecta los mensajes MMS entrantes, sin embargo, no los detecta. Aquí está la aplicación:

package com.kolomiyets.MMStesting; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.ContentObserver; import android.net.Uri; import android.os.Bundle; import android.widget.TextView; public class MMStesting extends Activity { public static final String MMSMON_RECEIVED_MMS = "MMStesting.intent.action.MMSMON_RECEIVED_MMS"; Uri mmsInURI = Uri.parse("content://mms"); ContentObserver mmsObserver = new ContentObserver(null) { @Override public void onChange(boolean selfChange) { Thread mmsNotify = new Thread(){ @Override public void run() { Intent mIntent = new Intent(MMSMON_RECEIVED_SMS); sendBroadcast(mIntent); super.run(); } }; mmsNotify.start(); super.onChange(selfChange); } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); BroadcastReceiver mmsMonitorBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { TextView log = (TextView)findViewById(R.id.mms_log); log.append("\n MMS Received;"); } }; IntentFilter mIntentFilter = new IntentFilter(); mIntentFilter.addAction(MMSMON_RECEIVED_MMS); registerReceiver(mmsMonitorBroadcastReceiver, mIntentFilter); getApplicationContext().getContentResolver().registerContentObserver(mmsInURI, true, mmsObserver); getApplicationContext().getContentResolver().notifyChange(mmsInURI, mmsObserver); } @Override protected void onDestroy() { getApplicationContext().getContentResolver().unregisterContentObserver(mmsObserver); super.onDestroy(); } } 

Y el manifiesto:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.kolomiyets.MMStesting" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="4" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-permission android:name="android.permission.RECEIVE_MMS"/> <uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INSTALL_DRM"/> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MMStesting" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> 

Hasta ahora he intentado "content: // mms-sms" y la aplicación comienza a detectar algo sin fin después de que el dispositivo recibe el mensaje MMS. No hay ninguna indicación sobre nuevos MMS en la barra de estado (como debe ser), sin embargo el mensaje aparece en los mensajes entrantes o_O …

También intenté poner "content: // sms" y todo funciona como se suponía (detección de SMS entrantes y salientes e incluso MMSs o_O)

¿No entiendo algo? ¿Hay alguna forma de corregir mi aplicación para que detecte cambios en "content: // mms"? Si no funciona en esta aplicación, ¿de que no podré utilizar este contenido en mis solicitudes de base de datos? Si detecto cambios con "content: // sms", ¿cómo puedo distinguir entre SMS y MMS? (Me gustaría obtener lo que está en MMS también). O puede ser la mejor idea es simplemente tomar todas las clases de las fuentes de Android y tratar de modificarlos de la manera que quiero? … pero no me gustaría hacerlo)))

Aquí hay una

Grepcode.com: Clase de telefonía que contiene MMS calass (también este sitio es conveniente para navegar el código fuente android)

Esta información describe un poco, cómo recuperar información de mensajes MMS que están en la base de datos. Sin embargo, todavía no puedo encontrar la manera de detectar mensajes entrantes y salientes de MMS.

Me parece que tengo que monitorear "content: // sms" para detectar MMSs (ya que "content: // sms" reacciona en MMS entrantes y "content: // mms" no lo hace), y que Trabajar con "content: // mms" sobre Cursor y ContentResolver.

Pero no estoy seguro de que este es un camino correcto … También no entiendo lo que realmente Parte (o PduPart) representa … Voy a obtener una imagen completa mediante la recuperación de parte de MMS o será una parte de la ¿imagen? ¿Y hay alguna diferencia entre "content: // mms // part" y "content: // mms / part /"?

Aquí también hay un momento interesante con los mensajes Push de WAP. Por lo que he entendido estos representan algún tipo de algunos mensajes SMS especiales con enlaces hiper, y también se utilizan para transferir configuraciones de proveedor de telefonía móvil a cliente. Esta clase:

Code.google.com: Se supone que MmsReceiver.java detecta mensajes MMS con la ayuda de WAP Push Massages.

Realmente no puedo entenderlo. ¿Cómo?

Detectar un mensaje MMS entrante es fácil, solo se pone en el receptor de emisión que supervisa eventos WAP_PUSH_RECIEVED, como en …

 <receiver android:name=".PushReceiver"> <intent-filter> <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" /> <data android:mimeType="application/vnd.wap.mms-message" /> </intent-filter> </receiver> 

Hacer sentido de lo que se obtiene es mucho más difícil. Conseguí descodificar todo lo que quería de la intención WAP_PUSH_RECEIVED clonando el código de análisis PDU de la aplicación Mms.

Recuperar el contenido real de los archivos de pieza es lo que todavía estoy trabajando, que es cómo encontré este tema en primer lugar.

Aquí hay algunos enlaces útiles que he encontrado:

Anddev.org: ¿Dónde puedo encontrar información sobre el envío / recepción de MMS?

Anddev.org: Accede al contenido del archivo de pieza MMS

El mensaje entrante que su detector de ContentObserver detecta es MMS de notificación, cuando el teléfono recibe esta notificación, descargará de mmsc el MMS real. Por lo tanto, cuando detecte un nuevo msg, debe filtrar el tipo de notificación.

 final IntentFilter filterMMS = IntentFilter.create("android.provider.Telephony.WAP_PUSH_RECEIVED", "application/vnd.wap.mms-message"); filterMMS.setPriority(Integer.MAX_VALUE); registerReceiver(smsreceiver, filterMMS); 

Por lo que sé: proveedor de contenido MMS o SMS no es una parte del SDK y no debe tratar de acceder a él. Por ejemplo, los fabricantes de hardware como Samsung o HTC son libres de modificar la aplicación de mensajería estándar. En tal caso, si el usuario intenta usar su aplicación con la aplicación de mensajería que tiene un esquema diferente de la aplicación estándar, es posible que su base de datos esté dañada y pueda perder todos sus datos, culpando a su aplicación. También tales acciones hacen que Android parezca mal diseñado e inestable.

Puede leer más sobre esto aquí: http://www.androidguys.com/2009/12/14/code-pollution-reaching-past-the-sdk/

  • Cómo consultar el MMS Iniciar sesión en Android
  • Android agrega MMS a base de datos
  • Cómo transmitir a través de mms: //
  • Android: ¿Existe una forma universal de enviar el MMS en cualquier dispositivo Android?
  • Desarrollo de la versión personalizada de la aplicación incorporada de SMS / MMS para Android
  • Activa la aplicación MMS de Android para enviar mensajes pendientes
  • Enviar MMS desde Mi aplicación en android
  • ¿Cómo puedo ordenar SMS y MMS juntos?
  • Enviar MMS mediante programación
  • Cómo leer datos MMS en Android?
  • Anular la aplicación predeterminada de mensajería de android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.