【发布时间】:2012-11-07 12:11:09
【问题描述】:
我的应用程序是否可以接收来自特定电话号码的短信,而不让它触发系统通知,但让所有其他消息传递到默认短信应用程序以正常处理?
如果是这样,系统如何知道哪个进程首先在队列中选择要接收的消息?
【问题讨论】:
我的应用程序是否可以接收来自特定电话号码的短信,而不让它触发系统通知,但让所有其他消息传递到默认短信应用程序以正常处理?
如果是这样,系统如何知道哪个进程首先在队列中选择要接收的消息?
【问题讨论】:
我没有尝试过,但理论上它应该可以工作:
在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()。
【讨论】:
我认为这是不可能的,原因有很多。任何人都有这样的津贴可以做任何事情。详情请查看http://groups.google.com/group/android-developers/browse_thread/thread/78fecbc156f4a1ea
【讨论】:
Peter Knego 的回答是正确的。我试图做这件事,尝试了他的解决方案,它确实有效,除了我使用过:
this.abortBroadcast();
在广播接收器中。
【讨论】:
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 以接收短信的应用程序
【讨论】:
我不认为这是可能的......因为 android 为我们提供了只监听事件的广播监听器。所以你必须阅读每条消息并检查它的号码,如果它是你的,做一个操作,否则忽略它....默认消息应用程序会自动处理它....
【讨论】: