Android:从特定电话号码接收短信

时间:2011-01-31 13:19:46

标签: android sms

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

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

5 个答案:

答案 0 :(得分:3)

我没试过这个,但从理论上说它应该有效:

在Android中,SMS广播以ordered broadcast发送,这意味着接收器按顺序处理并可以取消广播。见SMSDispatcher.java,第420行。

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

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

取消广播电话broadcastReceiver.setResultCode(RESULT_CANCELED)。这样,SMS广播将被取消,系统短信应用程序(和短信通知程序)将不会显示。

<强>更新

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

更新2:

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

答案 1 :(得分:2)

我的第二个法其因为多少原因而不可能。任何人都可以做这样的补贴。请查看详细信息http://groups.google.com/group/android-developers/browse_thread/thread/78fecbc156f4a1ea

答案 2 :(得分:1)

Peter Knego的回答是正确的。我试图做到这一点,尝试了他的解决方案,除了我用过之外它确实有效:

this.abortBroadcast();

在broadcastReceiver中。

答案 3 :(得分: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()来阻止短信到达收件箱或已设置BroadcastReceiver以接收短信的任何其他应用程序

答案 4 :(得分:0)

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