2012-07-11 10 views
7

seguí un tutorial para recibir SMS en mi aplicación y leerlo para pasar el cuerpo de SMS a Toast. que es la clase de Receptor.Recibir SMS en la aplicación de Android

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 de manifiesto

<receiver android:name="com.msoft.masrooq.SmsReciever"> 
    <intent-filter> 
    <action android:name="android.provider.telephony.SMS_RECIEVED"></action> 
    </intent-filter> 
    </receiver> 
     <uses-permission android:name="android.permission.RECEIVE_SMS"/> 
      <uses-permission android:name="android.permission.READ_SMS" /> 

la aplicación se inicia bien, pero no es así respuesta a la recepción de SMS que no hace nada.

+0

¡¡¡Estoy haciendo algo similar AQUÍ !!! http://stackoverflow.com/questions/14452808/sending-and-receiving-mms-in-android – toobsco42

+0

mira este sencillo tutorial http://tech-papers.org/receive_sms_from_android_app/ –

Respuesta

19

Aquí está mi implementación para recibir mensajes sms. El mensaje SMS puede dividirse en muchos, observe cómo se trata. También verifique 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

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.smsreceiver" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="4" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity 
      android:name=".SmsLoggerActivity" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <receiver android:name="com.example.smsreceiver.SmsReceiver" android:enabled="true"> 
      <intent-filter android:priority="2147483647"> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

Pocas notas: si se declara su receptor en XML de sistema puede utilizar su receptor, independientemente de su aplicación fue jamás lanzado. Dado que las notificaciones de Android 1.6 sobre mensajes SMS recibidos se envían como transmisiones ordenadas, puede usar el atributo android:priority de <intent-filter> para indicarle al sistema que envíe primero los sms a su aplicación (también puede llamar a abortBroadcast() para que otras aplicaciones no los reciban , 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.

+0

+1 Solo un aviso, android. permission.SEND_SMS y android.permission.RECEIVE_SMS son diferentes. Y en su actividad principal simplemente cree un objeto SmsReceiver(). – Sydwell

+0

¿Cómo implementar esto para MMS? – Arya

2

Las emisiones distinguen mayúsculas de minúsculas. Use "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 es obligatoria:

<intent-filter> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
Cuestiones relacionadas