2011-03-04 62 views
6

我想要的是:我想成为第一个接收短信广播的人,如果短信仅限于我的兴趣,我希望取消广播,以便广播不会到达任何其他应用/接收者(默认消息应用程序等)。 我知道的是:正在中止/取消广播

  • SmsDisptacher.java使用orderedBroadcasts可以被取消/中止。

什么我不知道的是:

  • 如果orderedBrodcasts可以为其他应用程序被取消/接收器,即比自己其他。

我曾尝试成为第一个接收广播:

  • 意向过滤器的android:优先=“1000”

我曾尝试对已经取消的广播:

  • AbortBroadcast();
  • broadcastReceiver.setResultCode(RESULT_CANCELED)
  • clearAbortBroadcast()

回答

0
+0

这是可能的,使用您在问题中描述的方法。您是否记得在清单中设置正确的权限?看看你的logcat输出,以确定系统注册传入短信的位置,并找出接收器为什么不拦截它。 – Marmoy 2011-07-13 11:03:19

+0

我已经提交了一个完整的答案,以澄清 – Marmoy 2011-07-13 11:04:30

1

有可能做到这一点,我做了一个教程检查,请herehere 只是中止播出层次

11

这当然是可能的顶部。 注册您的接收器在您的清单如下:

<receiver android:name=".SmsReceiver"> 
    <intent-filter android:priority="1000"> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 

在你的接收机的onReceive方法写:

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(SMS_RECEIVED)) { 
     //do your stuff 
     abortBroadcast(); 
    } 
} 

记住设置权限在清单这样收到短信:

<uses-permission android:name="android.permission.RECEIVE_SMS"/> 

如果没有正确的权限设置,它将以下面的logcat消息静默失败:

07-13 12:54:13.208: WARN/ActivityManager(201): Permission Denial: receiving Intent { act=android.provider.Telephony.SMS_RECEIVED (has extras) } to com.mypackage requires android.permission.RECEIVE_SMS due to sender com.android.phone (uid 1001) 

最后,另一个应用程序可能已经注册了一个比您的优先级更高的接收者,并且因此它在您取消它之前接收广播。所以如果一切都失败了,试试更高优先级的值。

+0

如果我不想触摸清单文件,该怎么办......是否是registerReceiver(smsSentReceiver,新的IntentFilter(TAG_SENT))的方法;“总是工作?@Videre – gumuruh 2014-08-06 17:49:16

+0

@gumuruh我期望在运行时注册接收器与Context.registerReceiver只保证接收广播只要应用程序正在运行。这意味着当收到消息时,系统不会唤醒“睡眠”应用程序,除非它在清单中注册。如果我错了,有人纠正我。 – Marmoy 2014-08-08 08:47:54

+0

好的。我已经得到了。@Videre – gumuruh 2014-08-08 16:29:28