Recibir SMS en la aplicación de Android

Seguí un tutorial para recibir SMS en mi aplicación y lo leí para pasar el cuerpo de SMS a Toast. Esa es la clase de Receptor.

public class SmsReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ Bundle bundle= intent.getExtras(); SmsMessage[] msgs= null; String str=""; if(bundle != null ){ Object [] pdus=(Object[]) bundle.get("pdus"); msgs=new SmsMessage[pdus.length]; for(int i=0; i< msgs.length;i++){ msgs[i]= SmsMessage.createFromPdu((byte[])pdus[i]); str+= msgs[i].getMessageBody(); } Toast.makeText(context, str, Toast.LENGTH_LONG).show(); } } } 

el archivo manifiesto

         

la aplicación comienza bien pero no responde a la recepción de sms, no hace nada.

Aquí está mi implementación de recibir mensajes SMS. El mensaje SMS puede dividirse en muchos, observe cómo se trata. También verifica el atributo android:priority .

 public class SmsReceiver extends BroadcastReceiver { private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(SMS_RECEIVED)) { Bundle bundle = intent.getExtras(); if (bundle != null) { // get sms objects Object[] pdus = (Object[]) bundle.get("pdus"); if (pdus.length == 0) { return; } // large message might be broken into many SmsMessage[] messages = new SmsMessage[pdus.length]; StringBuilder sb = new StringBuilder(); for (int i = 0; i < pdus.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); sb.append(messages[i].getMessageBody()); } String sender = messages[0].getOriginatingAddress(); String message = sb.toString(); Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); // prevent any other broadcast receivers from receiving broadcast // abortBroadcast(); } } } } 

AndroidManifest.xml

                   

Pocas notas: si declara su receptor en xml, entonces el sistema puede usar su receptor independientemente de si alguna vez se lanzó su aplicación. Dado que las notificaciones de Android 1.6 sobre los mensajes SMS recibidos se envían como transmisiones ordenadas, puede usar android:priority atributo de android:priority de para indicarle al sistema que envíe el sms primero a su aplicación (también puede llamar a abortBroadcast () para que otras aplicaciones no recibe el sms, por ejemplo, la aplicación nativa de sms). No olvide que el receptor de difusión tiene alrededor de 10 segundos para ejecutar su operación; de lo contrario, puede terminar prematuramente antes de terminar su trabajo.

Las transmisiones son sensibles a mayúsculas y minúsculas. Utilice “android.provider. Telefonía .SMS_RECEIVED” no “android.provider. Telefonía .SMS_RECEIVED”

Además, también tengo un conjunto de categorías, pero no estoy seguro de que sea obligatorio:

     

Nota: que en algunos dispositivos su código no funcionará sin android: priority = “100” en el filtro de intención:

    ...      ...  

Y aquí el código de Java:

 public class SMSReceiver extends BroadcastReceiver { public static final String ACTION ="android.provider.Telephony.SMS_RECEIVED"; private static final String SMS_SENDER="123456789"; @Override public void onReceive(Context context, Intent intent) { if (intent != null && intent.getAction() != null && ACTION.compareToIgnoreCase(intent.getAction()) == 0) { Object[] pduArray = (Object[]) intent.getExtras().get("pdus"); SmsMessage[] messages = new SmsMessage[pduArray.length]; for (int i = 0; i < pduArray.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]); } // SMS Sender, example: 123456789 String sms_from = messages[0].getDisplayOriginatingAddress(); //Lets check if SMS sender is 123456789 if (sms_from.equalsIgnoreCase(SMS_SENDER)) { StringBuilder bodyText = new StringBuilder(); // If SMS has several parts, lets combine it :) for (int i = 0; i < messages.length; i++) { bodyText.append(messages[i].getMessageBody()); } //SMS Body String body = bodyText.toString(); // Lets get SMS Code String code = body.replaceAll("[^0-9]", ""); } } }