Android 安卓:接收来自特定电话号码的短信

Android 安卓:接收来自特定电话号码的短信,android,sms,Android,Sms,我的应用程序是否可以接收来自特定电话号码的SMS,而不让它触发系统通知,但让所有其他消息传递到默认SMS应用程序以正常处理 如果是这样的话,系统如何知道队列上的哪个进程首先选择接收哪些消息?我认为这是不可能的。。。。因为android给了我们广播侦听器,它只监听事件。所以你必须阅读每一条信息,检查号码,如果是你的,做一个操作,否则就忽略它。。。。默认的消息传递应用程序将自动处理它 我没有试过这个,但理论上应该可以: 在安卓系统中,短信广播是按顺序发送的,这意味着接收器被有序处理,可以取消广播。见

我的应用程序是否可以接收来自特定电话号码的SMS,而不让它触发系统通知,但让所有其他消息传递到默认SMS应用程序以正常处理


如果是这样的话,系统如何知道队列上的哪个进程首先选择接收哪些消息?

我认为这是不可能的。。。。因为android给了我们广播侦听器,它只监听事件。所以你必须阅读每一条信息,检查号码,如果是你的,做一个操作,否则就忽略它。。。。默认的消息传递应用程序将自动处理它

我没有试过这个,但理论上应该可以:

在安卓系统中,短信广播是按顺序发送的,这意味着接收器被有序处理,可以取消广播。见第420行

为了首先被呼叫,接收器必须比其他接收器具有更高的优先级

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

. . .
取消广播呼叫。这样,SMS广播将被取消,并且不会由系统SMS应用程序(和SMS通知程序)显示

更新:

还可以尝试使用
broadcastReceiver.setResultCode(Intents.RESULT\u SMS\u HANDLED)

更新2:


user672601在另一个回答中指出,这确实有效,但他在广播接收机内部使用了
abortBroadcast()

我认为这是不可能的,原因有很多。任何人都可以用这种津贴做任何事。有关详细信息,请查看此信息

彼得·克内戈的回答是正确的。我正试图做这件事,尝试他的解决方案,它确实有效,除了我使用:

this.abortBroadcast();
在broadcastReceiver内部。

公共类NotifyServiceReceiver扩展了broadcastReceiver{
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();
            }

        }

    }
    }

}
 }
静态最终字符串ACTION=“android.provider.Telephony.SMS_RECEIVED”; @凌驾 公共void onReceive(上下文arg0,意图arg1){ //TODO自动生成的方法存根 if(arg1.getAction().equalsIgnoreCase(操作)) { Bundle extras=arg1.getExtras(); 字符串strMessage=“private message”; 如果(附加值!=null) { Object[]smsextras=(Object[])extras.get(“PDU”); 对于(int i=0;i

您可以通过将活动的优先级设置为100或高于清单文件中的优先级来告诉系统,这样当您收到sms时,您的应用程序将访问它并调用abortBroadcast()它将阻止短信到达收件箱或任何其他已将BroadcastReceiver设置为接收短信的应用程序,因此只要我没有明确取消broadcastReveiver(或可能将其标记为Handled),它将被发送到队列上的下一个侦听器?这正是我需要的。在尝试之前接受你的答案听起来很肯定。:)是的,订购的广播可以取消。这个链接解释了这一点: