Android: escucha los mensajes SMS entrantes

Estoy tratando de crear una aplicación para el seguimiento de los mensajes SMS entrantes, y lanzar un programa a través de SMS entrantes, también debe leer el contenido del SMS.

Flujo de trabajo:

SMS enviado a Android dispositivo auto ejecutables Aplicación Leer la información de SMS

¡Si alguien me puede ayudar!

4 Solutions collect form web for “Android: escucha los mensajes SMS entrantes”

public class SmsListener extends BroadcastReceiver{ private SharedPreferences preferences; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){ Bundle bundle = intent.getExtras(); //---get the SMS message passed in--- SmsMessage[] msgs = null; String msg_from; if (bundle != null){ //---retrieve the SMS message received--- try{ 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]); msg_from = msgs[i].getOriginatingAddress(); String msgBody = msgs[i].getMessageBody(); } }catch(Exception e){ // Log.d("Exception caught",e.getMessage()); } } } } } 

Nota: En su archivo de manifiesto, agregue el BroadcastReceiver-

 <receiver android:name=".listener.SmsListener"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> 

Agregue este permiso:

 <uses-permission android:name="android.permission.RECEIVE_SMS" /> 

Tenga en cuenta que en algunos dispositivos su código no funcionará sin android: priority = "1000" en el filtro de intenciones:

 <receiver android:name=".listener.SmsListener"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> 

Y aquí hay algunas optimizaciones:

 public class SmsListener extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) { for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) { String messageBody = smsMessage.getMessageBody(); } } } } 

Nota :
El valor debe ser un entero, como "100". Los números más altos tienen una prioridad más alta. El valor predeterminado es 0. El valor debe ser mayor que -1000 y menor que 1000.

Aquí hay un enlace.

@Mike M. y yo encontramos un problema con la respuesta aceptada (ver nuestros comentarios):

Básicamente, no tiene sentido pasar por el bucle for si no estamos concatenando el mensaje multipart cada vez:

 for(int i=0; i<msgs.length; i++){ msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); msg_from = msgs[i].getOriginatingAddress(); String msgBody = msgs[i].getMessageBody(); } 

Observe que simplemente establecemos msgBody al valor de la cadena de la parte respectiva del mensaje sin importar el índice en el que se encuentre, lo que hace que el punto completo de realizar un bucle a través de las diferentes partes del mensaje SMS sea inútil, ya que sólo se establecerá en el Muy último valor de índice. En su lugar, deberíamos usar += , o como Mike anotó, StringBuilder :

En general, aquí es lo que mi SMS recibiendo código se ve como:

 if (myBundle != null) { Object[] pdus = (Object[]) myBundle.get("pdus"); // pdus is key for SMS in bundle //Object [] pdus now contains array of bytes messages = new SmsMessage[pdus.length]; for (int i = 0; i < messages.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); //Returns one message, in array because multipart message due to sms max char Message += messages[i].getMessageBody(); // Using +=, because need to add multipart from before also } contactNumber = messages[0].getOriginatingAddress(); //This could also be inside the loop, but there is no need } 

Sólo poniendo esta respuesta allí en caso de que alguien más tiene la misma confusión.

¡Esto es lo que usé!

 public class SMSListener extends BroadcastReceiver { // Get the object of SmsManager final SmsManager sms = SmsManager.getDefault(); String mobile,body; public void onReceive(Context context, Intent intent) { // Retrieves a map of extended data from the intent. final Bundle bundle = intent.getExtras(); try { if (bundle != null) { final Object[] pdusObj = (Object[]) bundle.get("pdus"); for (int i = 0; i < pdusObj.length; i++) { SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); String phoneNumber = currentMessage.getDisplayOriginatingAddress(); String senderNum = phoneNumber; String message = currentMessage.getDisplayMessageBody(); mobile=senderNum.replaceAll("\\s",""); body=message.replaceAll("\\s","+"); Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + body); // Show Alert int duration = Toast.LENGTH_LONG; Toast toast = Toast.makeText(context, "senderNum: "+ mobile+ ", message: " + message, duration); toast.show(); } // end for loop } // bundle is null } catch (Exception e) { Log.e("SmsReceiver", "Exception smsReceiver" +e); } } } 
  • Cómo obtener lista de sms como convesations en cada dispositivo Android 2.2+
  • Android4.4 no puede manejar la intención de sms con "vnd.android-dir / mms-sms"
  • Escucha SMS salientes o caja enviada en Android
  • Android DevicePolicyManager lockNow ()
  • Puedo enviar "SMS recibido intención"?
  • Cómo desactivar mi aplicación sms como aplicación predeterminada en Android
  • Excepción de puntero nulo, Parcel.ReadException al enviar SMS?
  • Permitir que el usuario que utiliza el navegador móvil para enviar el código de producto que quieren por SMS
  • Podría un emulador enviar un SMS a sí mismo
  • Android: cómo marcar sms como leído en onReceive
  • SMS de confirmación no deseados enviados por el proveedor en Austria
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.