android – “导出的接收器不需要许可”的接收器意图从系统服务接收
我在AndroidManifest中声明了一些接收器:
<!-- no warning --> <receiver android:name=".receivers.TriggerMonitoringBootReceiver" android:enabled="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <!-- no warning --> <receiver android:name=".receivers.ScanResultsReceiver" android:enabled="false"> <intent-filter> <action android:name="android.net.wifi.SCAN_RESULTS" /> </intent-filter> </receiver> <!-- warning : Exported receiver does not require permission--> <receiver android:name=".receivers.BatteryMonitoringReceiver" android:enabled="false"> <intent-filter> <action android:name="@string/intent_action_setup_alarm" /> <action android:name="@string/intent_action_cancel_alarm" /> <action android:name="@string/intent_action_monitor" /> </intent-filter> </receiver>
第一个是为了接收一个BOOT_COMPLETED
动作。 第二个意思是接收android.net.wifi.SCAN_RESULTS
。 第三个是为了接收我广播的一些动作(intent_action_monitor)和一些由AlarmManager
(intent_action_setup_alarm等)广播的动作。
两个问题:
- 为什么我不能在所有的接收器上得到警告?
- 我需要为接收者设置什么样的权限才能从系统服务接收来纠正警告 (我了解它是什么,我不希望任何人使用我的接收器)? 对于启动接收器,wifi接收器,报警接收器等, 会
exported="false"
吗?
我想使用android:protectionLevel="signatureOrSystem"
的自定义权限,但文档build议针对这个保护级别和自定义权限 。 那么我应该如何处理这个警告?
链接到文档和/或一些代码将不胜感激。
为什么我不能在所有的接收器上得到警告?
因为前两个显然是devise为由Android播放。 最后一个是未知的,部分原因是您没有提供string资源值,并且可能是因为它们是您自己的唯一操作string。
我需要为接收器设置什么权限才能从系统服务接收来纠正警告
正确的解决scheme是删除<intent-filter>
。 如果您正在广播这些Intents
,或者如果您将一个Intent
包装到getBroadcast()
PendingIntent
,则不需要操作string。 使用以Java类对象作为第二个参数的Intent
构造函数,并使用它:
new Intent(this, BatteryMonitoringReceiver.class)
如果您愿意,欢迎您将操作string附加到该Intent
,但可以转储<intent-filter>
(路由将基于提供的组件,本例中为Java类)。
当您期望操作系统或第三方应用程序自己启动Intent
(执行您创build的PendingIntent
不计数)时,只能使用<intent-filter>
。
如果你想把你的接收器导出到其他进程,你可以在你的android-manifest文件中添加你自己的权限定义来避免这个警告,比如
<permission android:name="com.yourpage.permission.YOUR_PERMISSION" android:protectionLevel="normal" /> <uses-permission android:name="com.yourpage.permission.YOUR_PERMISSION" /> <receiver <!-- warning : Exported receiver does not require permission--> android:name=".receivers.BatteryMonitoringReceiver" android:permission="com.yourpage.permission.YOUR_PERMISSION" android:enabled="false" > <intent-filter> <action android:name="@string/intent_action_setup_alarm" /> <action android:name="@string/intent_action_cancel_alarm" /> <action android:name="@string/intent_action_monitor" /> </intent-filter> </receiver>
有关更多信息,请参阅http://developer.android.com/training/articles/security-tips.html
警告“导出的接收器不需要权限”意思是说,你有一个intent-filter
的一些行动(这意味着默认情况下,你已经设置了android:exported="true"
,它现在receive broadcasts
从你的application
之外的任何广播机构receive broadcasts
)由于它可以receive broadcasts
任何broadcasters
在你的应用程序之外的broadcasters
,它会警告你说:“嘿,你确定任何广播公司可以援引你吗?在我看来,如果你只允许那些broadcasters
公司援引你有permission
你已经通过android:permission"
设置了这个receiver
android:permission"
您可以通过将android:exported="false"
到接收者标记来删除此警告
如果像我一样,你在这里是因为你以前的SDK版本构build的应用程序停止使用更新的版本,而你想用最小的修改来修复它,只需添加
机器人:出口= FALSE
到清单文件中的接收器标签。 CommonsWare的解决scheme显然是长期的解决scheme,但是如果您使用自定义意图,并且不意味着导出它们,则可以暂时解决问题。
按照Lubo的方式,您需要导出这个自定义权限,这会在安装之前提示用户。 这意味着权限的描述性文本需要写的很好,所以你最终不会吓着用户改变他的想法来安装应用程序。 此外,它需要翻译成所有的目标语言。