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的方式,您需要导出这个自定义权限,这会在安装之前提示用户。 这意味着权限的描述性文本需要写的很好,所以你最终不会吓着用户改变他的想法来安装应用程序。 此外,它需要翻译成所有的目标语言。