2012-02-07 75 views
15

我正在開發一個商業短信應用程序。在此應用程序中,如果收到的郵件來自特定號碼(例如999999999),它應該轉到應用程序的收件箱,而不是默認的本機收件箱。所有其他消息應該發送到手機的本機收件箱。我該怎麼做呢?如何防止SMS進入Android的收件箱?

+0

http://stackoverflow.com/questions/9123125/class-0-sms-flash-sms-on-android/9123172#9123172 – xDragonZ 2012-02-07 12:31:22

+0

@Tom Medely。謝謝。 – nsm 2012-02-07 20:06:14

+0

可能[重複](http://stackoverflow.com/q/1741628/1050058) – 2012-10-06 10:35:32

回答

1

你是發送消息的人嗎?如果是這樣,請考慮使用數據傳輸,因爲它們不會顯示在收件箱中。

檢查this問題,瞭解如何使用它

+0

謝謝。這對我幫助很大。 – nsm 2012-02-07 20:08:57

30

當短信被Android系統接收到的,它廣播一個ordered broadcastIntent用行動"android.provider.Telephony.SMS_RECEIVED"更多信息。包括系統默認SMS應用程序在內的所有已註冊的接收器按priority的順序接收到,該順序在其intent-filter中設置。未指定具有相同優先級的廣播接收者的訂單。任何BroadcastReceiver都可以阻止任何其他註冊的廣播接收機使用abortBroadcast()接收廣播。

所以,你需要的一切是廣播接收機是這樣的:

public class SmsFilter extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { 
      Bundle extras = intent.getExtras(); 
      if (extras != null) { 
       Object[] pdus = (Object[])extras.get("pdus"); 

       if (pdus.length < 1) return; // Invalid SMS. Not sure that it's possible. 

       StringBuilder sb = new StringBuilder(); 
       String sender = null; 
       for (int i = 0; i < pdus.length; i++) { 
        SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]); 
        if (sender == null) sender = message.getOriginatingAddress(); 
        String text = message.getMessageBody(); 
        if (text != null) sb.append(text); 
       } 
       if (sender != null && sender.equals("999999999")) { 
        // Process our sms... 
        abortBroadcast(); 
       } 
       return; 
      } 
     } 

     // ... 
    } 
} 

貌似系統默認的業務處理應用程序使用的0優先級,所以你可以嘗試1您的應用程序,在它之前。這些行添加到您的AndroidManifest.xml

<receiver android:name=".SmsFilter"> 
    <intent-filter android:priority="1"> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 

不要忘了必要的權限:

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

順便說一句,你可以找到所有已註冊的接收器和它們的優先級使用此代碼:

Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED"); 
List<ResolveInfo> infos = context.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0); 
for (ResolveInfo info : infos) { 
    System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority); 
} 

更新:由於FantasticJamieBurn said below,從Android 4.4開始,唯一可以攔截的應用程序短信(如果需要,可以阻止)是默認的短信應用程序(由用戶選擇)。如果默認的短信應用沒有阻止,所有其他應用只能收聽短信。

請參閱Android 4.4 API中的SMS Provider

+1

絕對出色的答案,很好的解釋,爲我工作。謝謝。 – 2014-02-14 10:30:31

+4

這似乎不適用於Android操作系統> = 4.3 – 2014-03-27 13:35:13

2

是這是可以做到

public void onReceive(Context context, Intent intent) 
{ 
    Bundle bundle=intent.getExtras(); 
    Object[] messages=(Object[])bundle.get("pdus"); 
    SmsMessage[] sms=new SmsMessage[messages.length]; 

    Toast.makeText(context, "Hello", 1).show(); 

    for(int n=0;n<messages.length;n++){ 
     sms[n]=SmsMessage.createFromPdu((byte[]) messages[n]); 
    } 

    for(SmsMessage msg:sms){ 
     if(msg.getOriginatingAddress().endsWith(number)) 
     { 
     SMS.updateMessageBox("\nFrom: "+msg.getOriginatingAddress()+"\n"+ 
       "Message: "+msg.getMessageBody()+"\n"); 
      /*((SMS) context).delete();*/ 
     abortBroadcast(); 
     } 
    } 
} 

只是使用abortbroadcast()接收應用

12

藉助Android 4.4奇巧(API級19),以阻止一個SMS選項的釋放後消息並阻止其傳遞到默認的SMS應用程序已被刪除。非默認短信應用程序可能會在收到短信時觀察到短信,但任何中止廣播的嘗試都將被Android 4.4+忽略。

如果您有一個依賴於中止SMS消息廣播的現有應用程序,那麼您可能需要考慮當用戶升級到Android 4.4+時,這種行爲變化的影響。

http://android-developers.blogspot.co.uk/2013/10/getting-your-sms-apps-ready-for-kitkat.html

+0

我也發現這不適用於4.3。 – 2014-03-27 13:34:21

1

檢查發件人數等於你的短信發送手機的手機號碼。

取代先生「腐敗的機器人」

if (sender != null && sender.equals("999999999")) { 

if (sender != null && sender.equals("YOUR SMS SENDING MOBILE NUMBER HERE")) { 

進一步的下面的代碼行越多,你能給的設置用戶手動添加短信發送號碼,如果他想改變它。