Android – Receptor de SMS Broadcast

He estado tratando de conseguir este programa para trabajar, pero hasta ahora no tener suerte. No puedo encontrar donde estoy haciendo mal. No estoy seguro si hay algo mal con el código, o la depuración.

Estoy tratando de ser notificado si llega un nuevo SMS.

Aquí está mi programa:

package Technicaljar.SMSBroadcastReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; import android.util.Log; public class SMSBroadcastReceiver extends BroadcastReceiver { private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; private static final String TAG = "SMSBroadcastReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "Intent recieved: " + intent.getAction()); if (intent.getAction() == SMS_RECEIVED) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[])bundle.get("pdus"); final SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]); } if (messages.length > -1) { Log.i(TAG, "Message recieved: " + messages[0].getMessageBody()); } } } } } 

Y el archivo de manifiesto:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="Technicaljar.SMSBroadcastReceiver" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true" > <receiver android:name=".SMSBroadcastReceiver"> <intent-filter> <action android:name="android.provider.telephony.SMS_RECEIVED"></action> </intent-filter> </receiver> </application> <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> </manifest> 

Estoy enviando SMS a través de Telnet, y no puedo ver ningún mensaje de Intent recibido en el logcat. Aquí está mi logcat desde el momento de la instalación.

 D/AndroidRuntime( 478): D/AndroidRuntime( 478): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<< D/AndroidRuntime( 478): CheckJNI is ON D/AndroidRuntime( 478): --- registering native functions --- D/AndroidRuntime( 478): Shutting down VM D/dalvikvm( 478): Debugger has detached; object registry had 1 entries I/AndroidRuntime( 478): NOTE: attach of thread 'Binder Thread #3' failed D/Mms:app ( 220): getSmsNewMessageNotificationInfo: count=14, first addr=12345, thread_id=4 D/dalvikvm( 151): GC_EXPLICIT freed 391 objects / 22552 bytes in 65ms D/dalvikvm( 220): GC_EXPLICIT freed 926 objects / 44840 bytes in 73ms 

Así que el SMS parece ser recibido por el emulador, pero parece que las intenciones no están disparando. ¿Qué estoy haciendo mal aquí? Después de instalar, ¿debo de alguna manera "iniciar" este receptor? Porque cuando instalo, obtengo

  [2010-11-07 21:24:41 - SMSBroadcastReceiver] No Launcher activity found! [2010-11-07 21:24:41 - SMSBroadcastReceiver] The launch will only sync the application package on the device! 

Así que me pregunto si algo está mal aquí.

android.provider.Telephony.SMS_RECEIVED tiene un T mayúscula, y el tuyo en el manifiesto no.

Tenga en cuenta que esta acción de Intent no está documentada.

Intenté su código y encontré que no trabajaba.

Tuve que cambiar

 if (intent.getAction() == SMS_RECEIVED) { 

a

 if (intent.getAction().equals(SMS_RECEIVED)) { 

Ahora está funcionando. Es sólo un problema con java comprobar la igualdad.

Una cosa importante que debe mencionarse con este hilo es la descripción aboud pdu
Una PDU es una "unidad de discripción de protocolo" , que es el formato de la industria para un mensaje SMS. Porque SMSMessage lee / escribe que usted no debe necesitar disecarlos.
Un gran mensaje puede ser dividido en muchos, por lo que es una matriz de objetos.

intent.getAction().equals(SMS_RECEIVED)

Lo he probado con éxito.

También tenga en cuenta que la aplicación de Hangouts bloqueará actualmente mi BroadcastReceiver de recibir mensajes SMS. Tuve que desactivar la funcionalidad de SMS en la aplicación de Hangouts (Configuración-> SMS-> Activar SMS), antes de que mi SMS BroadcastReceived comenzara a ser despedido.

Edit: Parece como si algunas aplicaciones abortBroadcast () en la intención que evitará que otras aplicaciones de recibir la intención. La solución es aumentar el atributo android:priority en la etiqueta de intent-filter :

  <receiver android:name="com.company.application.SMSBroadcastReceiver" > <intent-filter android:priority="500"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> 

Ver más detalles aquí: Habilitar el soporte de SMS en Hangouts 2.0 rompe el BroadcastReceiver de SMS_RECEIVED en mi aplicación

Tropezamos con esto hoy. Para cualquier persona codificando un receptor de SMS hoy en día, utilice este código en lugar del obsoleto en OP:

  SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent); SmsMessage smsMessage = msgs[0]; 

android.provider.telephony.SMS_RECEIVED no es correcto porque Telefonía es una clase y debe ser capital como en android.provider.Telephony.SMS_RECEIVED

Su receptor de broadcast debe especificar android:exported="true" para recibir transmisiones creadas fuera de su propia aplicación. Mi receptor de difusión se define en el manifiesto de la siguiente manera:

 <receiver android:name=".IncomingSmsBroadcastReceiver" android:enabled="true" android:exported="true" > <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> 

Como se indica a continuación, exportado = "true" es el valor predeterminado, por lo que puede omitir esta línea. Lo he dejado para que los comentarios de la discusión tengan sentido.

Para android 19+ puedes obtenerlo en Telephony.Sms.Intents.SMS_RECEIVED_ACTION) . Hay más en la clase de Intent que vale la pena mirar

  • Volver automáticamente a la anterior aplicación de SMS predeterminada
  • ¿Cómo enviar un mensaje SMS en un dispositivo Android en segundo plano?
  • ¿Cómo obtengo el nombre guardado de SMS Sender Contact (Person) mediante "content: // sms / inbox"
  • El observador SMS enviado se ejecuta 3 veces
  • Registro de SMS como en la aplicación para móviles: whatsapp
  • ¿Cómo leer el contenido del mensaje de un mensaje nuevo en el próximo mensaje en android?
  • SMS reciben sin notificación
  • SMS enviado a través de SmsManager no automáticamente en la carpeta SENT?
  • Android: escucha los mensajes SMS entrantes
  • ¿Puedo enviar un SMS anónimo con Android?
  • Caracteres especiales en sms de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.