2011-01-31 69 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(告诉系统),它会防止短信到达收件箱或已设置广播接收器来接收短信