【问题标题】:Android: Receiving SMS from specific phone numberAndroid:从特定电话号码接收短信
【发布时间】:2012-11-07 12:11:09
【问题描述】:

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

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

【问题讨论】:

    标签: android sms


    【解决方案1】:

    我没有尝试过,但理论上它应该可以工作:

    在Android SMS 广播发送为ordered broadcast,这意味着接收者按顺序处理并且可以取消广播。请参阅SMSDispatcher.java,第 420 行。

    为了首先被调用,接收者的优先级必须高于其他接收者。

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

    取消广播呼叫broadcastReceiver.setResultCode(RESULT_CANCELED)。这样一来,短信广播将被取消,系统短信应用(和短信通知器)不会显示。

    更新:

    也可以尝试使用broadcastReceiver.setResultCode(Intents.RESULT_SMS_HANDLED)

    更新 2:

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

    【讨论】:

    • 所以只要我不明确取消广播接收者(或者可能将其标记为已处理),它将被发送到队列中的下一个监听器?这正是我所需要的。在尝试之前接受你的答案听起来很积极。 :)
    • 是的,可以取消已订购的广播。这个链接解释它:developer.android.com/reference/android/content/…
    【解决方案2】:

    我认为这是不可能的,原因有很多。任何人都有这样的津贴可以做任何事情。详情请查看http://groups.google.com/group/android-developers/browse_thread/thread/78fecbc156f4a1ea

    【讨论】:

      【解决方案3】:

      Peter Knego 的回答是正确的。我试图做这件事,尝试了他的解决方案,它确实有效,除了我使用过:

      this.abortBroadcast();
      

      在广播接收器中。

      【讨论】:

        【解决方案4】:
        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() 来阻止短信到达收件箱或任何其他已设置 BroadcastReceiver 以接收短信的应用程序

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-08-30
            • 2019-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-28
            相关资源
            最近更新 更多