2012-07-11 2 views
7

Ho seguito un tutorial per ricevere SMS sulla mia applicazione e leggerlo per passare l'SMSbody a Toast. che è la classe Receiver.Ricezione di SMS sull'app per 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(); 
     } 
     } 

    } 

il file manifesto

<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" /> 

l'applicazione inizia bene, ma non è così risposta alla ricezione di sms non fa nulla.

+0

Sto facendo qualcosa di simile QUI !!! http://stackoverflow.com/questions/14452808/sending-and-receiving-mms-in-android – toobsco42

+0

controlla questo semplice tutorial http://tech-papers.org/receive_sms_from_android_app/ –

risposta

19

Ecco la mia implementazione di ricevere messaggi sms. Il messaggio Sms può essere suddiviso in molti, notare come viene trattato. Controlla anche l'attributo 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> 

alcune note: se si dichiara il ricevitore in XML di sistema può utilizzare il ricevitore indipendentemente dalla vostra applicazione è stato mai lanciato. Poiché le notifiche di Android 1.6 relative ai messaggi sms ricevuti vengono trasmesse come trasmissioni ordinate, è possibile utilizzare l'attributo android:priority di <intent-filter> per comunicare al sistema di inviare l'sms prima all'applicazione (è possibile anche chiamare abortBroadcast() in modo che altre applicazioni non ricevano l'SMS , ad esempio l'app nativa per sms). Non dimenticare che il ricevitore di trasmissione ha circa 10 secondi per l'esecuzione del suo funzionamento, altrimenti può essere interrotto prematuramente prima di terminare il suo lavoro.

+0

+1 Solo un avviso, Android. permesso.SEND_SMS e android.permission.RECEIVE_SMS sono diversi. E nella tua attività principale è sufficiente creare un oggetto SmsReceiver(). – Sydwell

+0

Come si implementa questo per MMS? – Arya

2

Le trasmissioni fanno distinzione tra maiuscole e minuscole. Utilizzare "android.provider Telefonia .SMS_RECEIVED.", Non "android.provider telefonia .SMS_RECEIVED."

Inoltre, ho anche un set di categoria, ma non sono sicuro che sia obbligatorio:

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