我的应用程序是否可以从特定的电话号码接收短信,而不会触发系统通知,但是让所有其他消息传递到默认的短信应用程序以便正常处理?
如果是这样,系统如何知道哪个进程首先在队列中选择要接收哪些消息?
答案 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)
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给我们播放了只监听事件的侦听器。所以你必须阅读每条消息,并检查它的数量,如果是你的,做一个操作,否则只是忽略它....默认的消息应用程序将自动处理它....