Android – Receptor de transmisión de SMS

He intentado hacer funcionar este progtwig, pero hasta ahora no he tenido suerte. No puedo encontrar donde estoy haciendo mal. No estoy seguro de si hay algún problema con el código o la depuración.

Estoy tratando de recibir una notificación si llega un nuevo SMS.

Aquí está mi progtwig:

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  -1) { Log.i(TAG, "Message recieved: " + messages[0].getMessageBody()); } } } } } 

Y el archivo manifiesto:

              

Estoy enviando SMS a través de Telnet, y no puedo ver ningún mensaje recibido de Intent 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 emulador parece haber recibido el SMS, pero parece que las intenciones no están encendidas. ¿Qué estoy haciendo mal aquí? Después de la instalación, ¿tengo que ‘iniciar’ de algún modo 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! 

Entonces me pregunto si algo está mal aquí.

android.provider.Telephony.SMS_RECEIVED tiene una T mayúscula, y la tuya en el manifiesto no.

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

Probé tu código y descubrí que no estaba funcionando.

Tuve que cambiar

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

a

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

Ahora funciona. Es solo un problema con java que verifica la igualdad.

También tenga en cuenta que la aplicación Hangouts bloqueará actualmente que BroadcastReceiver no reciba mensajes SMS. Tuve que deshabilitar 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.

Editar: parece que algunas aplicaciones abortaránBroadcast () con la intención de evitar que otras aplicaciones reciban el bash. La solución es boost el atributo android:priority en la etiqueta de intent-filter :

       

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

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. debido a que SMSMessage las lee / escribe, no debería necesitar diseccionarlas.
Un mensaje grande puede dividirse en muchos, por lo que es una matriz de objetos.

intent.getAction().equals(SMS_RECEIVED)

Lo he intentado con éxito.

Tropecé con esto hoy. Para cualquiera que codifique un receptor de SMS hoy en día, use este código en lugar de obsoleto en OP:

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

Su receptor de difusión 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:

      

Como se indica a continuación, exported = “true” es el valor predeterminado, por lo que puede omitir esta línea. Lo dejé para que los comentarios de la discusión tengan sentido.

Para Android 19+, puede obtenerlo en Telephony.Sms.Intents.SMS_RECEIVED_ACTION) . Hay más en la clase Intent que vale la pena mirar

android.provider.telephony.SMS_RECEIVED no es correcto porque Telephony es una clase y debe ser mayúscula como en android.provider.Telephony.SMS_RECEIVED

El código actualizado es:

  private class SMSReceiver extends BroadcastReceiver { private Bundle bundle; private SmsMessage currentSMS; private String message; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { bundle = intent.getExtras(); if (bundle != null) { Object[] pdu_Objects = (Object[]) bundle.get("pdus"); if (pdu_Objects != null) { for (Object aObject : pdu_Objects) { currentSMS = getIncomingMessage(aObject, bundle); String senderNo = currentSMS.getDisplayOriginatingAddress(); message = currentSMS.getDisplayMessageBody(); Toast.makeText(OtpActivity.this, "senderNum: " + senderNo + " :\n message: " + message, Toast.LENGTH_LONG).show(); } this.abortBroadcast(); // End of loop } } } // bundle null } } private SmsMessage getIncomingMessage(Object aObject, Bundle bundle) { SmsMessage currentSMS; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String format = bundle.getString("format"); currentSMS = SmsMessage.createFromPdu((byte[]) aObject, format); } else { currentSMS = SmsMessage.createFromPdu((byte[]) aObject); } return currentSMS; } 

el código anterior era:

 Object [] pdus = (Object[]) myBundle.get("pdus"); messages = new SmsMessage[pdus.length]; for (int i = 0; i < messages.length; i++) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String format = myBundle.getString("format"); messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format); } else { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); } strMessage += "SMS From: " + messages[i].getOriginatingAddress(); strMessage += " : "; strMessage += messages[i].getMessageBody(); strMessage += "\n"; } 

La syntax simple del código es:

 private class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) { SmsMessage[] smsMessages = Telephony.Sms.Intents.getMessagesFromIntent(intent); for (SmsMessage message : smsMessages) { // Do whatever you want to do with SMS. } } } }