2011-01-31 62 views
2

接收短信是否有可能爲我的應用程序接收來自特定電話號碼的短信,不讓它trig的系統通知,但讓所有其他消息傳遞給被正常處理的默認短信應用?安卓:從特定的電話號碼

如果是這樣,怎麼可以在系統知道哪個進程是第一隊列挑接收哪些消息?

回答

3

我沒有嘗試這一點,但理論上它應該工作:

在Android短信廣播發送爲ordered broadcast,這意味着接收器按順序處理,並可以取消廣播。見SMSDispatcher.java,線420

爲了先調用,接收機必須具有更高的優先級,然後其他人。

<intent-filter android:priority="1000" > 
    . . . 
</intent-filter> 

取消廣播電話broadcastReceiver.setResultCode(RESULT_CANCELED)。這樣,SMS廣播將被取消,並且不會被系統SMS應用程序(和SMS通知器)顯示。

更新:

也可以嘗試使用broadcastReceiver.setResultCode(Intents.RESULT_SMS_HANDLED)

更新2:

user672601的另一種回答指出,這確實是工作,但他用abortBroadcast()廣播接收器內。

+0

所以只要我沒有明確取消broadcastReveiver(或者將其標記爲handeled)任何其他應用程序,它會被髮送到隊列中下一個監聽器?這正是我需要的。聽起來很積極,在嘗試之前接受你的答案。 :) – Johan 2011-01-31 14:24:35

+0

是的,有序的廣播可以取消。此鏈接解釋它:http://developer.android.com/reference/android/content/BroadcastReceiver.html – 2011-01-31 20:21:50

0

我不認爲它的可能....因爲android給我們只監聽事件的廣播監聽器。所以你必須閱讀每封郵件,並檢查其是否你的號碼,做其他的操作就忽視它....缺省消息傳遞應用程序會自動處理它....

1

彼得Knego的答案是正確的。我試圖做這件事,嘗試了他的解決方案,它確實工作,除了我用:

this.abortBroadcast(); 

裏面的broadcastReceiver。

1
public class NotifyServiceReceiver extends BroadcastReceiver{ 
static final String ACTION ="android.provider.Telephony.SMS_RECEIVED"; 
@Override 
public void onReceive(Context arg0, Intent arg1) { 
    // TODO Auto-generated method stub 
    if(arg1.getAction().equalsIgnoreCase(ACTION)) 
    { 
    Bundle extras = arg1.getExtras(); 

    String strMessage = "private message"; 
    if (extras != null) 
    { 
     Object[] smsextras = (Object[]) extras.get("pdus"); 

     for (int i = 0; i < smsextras.length; i++) 
     { 
      SmsMessage smsmsg = SmsMessage.createFromPdu((byte[])smsextras[i]); 

      String strMsgBody = smsmsg.getMessageBody().toString(); 
      String strMsgSrc = smsmsg.getOriginatingAddress(); 

      //Toast.makeText(GasService.this,strMessage, Toast.LENGTH_SHORT).show(); 
      if(strMsgSrc.equals("+919XXXXXXXXX")) 
      { 
      strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;    
      Toast.makeText(PrivatesmsService.this,strMessage, Toast.LENGTH_SHORT).show(); 

      abortBroadcast(); 
      } 

     } 

    } 
    } 

} 
} 

您可以通過活動的優先級設置爲100或更高,然後在清單文件,這樣當過願意接收短信那麼你的應用程序將訪問它,並通過調用abortBroadcast(告訴系統),它會防止短信到達收件箱或已設置廣播接收器來接收短信