android - "导出的接收器不需要许可",用于从系统服务接收的接收器

Mr_*_*s_D 61 android broadcastreceiver android-manifest android-permissions android-broadcastreceiver

我在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>
Run Code Online (Sandbox Code Playgroud)

第一个是为了接受一个BOOT_COMPLETED动作.第二个是接收android.net.wifi.SCAN_RESULTS.第三个是接收我广播的一些动作(intent_action_monitor)和AlarmManager(intent_action_setup_alarm等)广播的一些动作.

两个问题:

  • 为什么我没有收到所有接收器的警告?
  • 我需要为接收器设置哪些权限才能从系统服务接收以更正警告(我理解它是什么,我不希望任何人使用我的接收器)? exported="false" 的启动接收器,无线接收器,报警接收等
    我想过使用自定义权限,android:protectionLevel="signatureOrSystem"但文档建议不要使用此保护级别自定义权限.那我该如何处理这个警告呢?

将非常感谢链接到文档和/或一些代码.

Com*_*are 64

为什么我没有收到所有接收器的警告?

因为前两个显然是由Android广播设计的.最后一个是未知的,部分原因是您没有提供字符串资源值,可能是因为它们是您自己的唯一操作字符串.

我需要为接收器设置哪些权限才能从系统服务接收以更正警告

正确的解决方案是删除<intent-filter>.如果您正在广播它们Intents,或者如果要将其包装成Intenta getBroadcast() PendingIntent,则不需要操作字符串.使用将IntentJava类对象作为第二个参数的构造函数,并使用:

new Intent(this, BatteryMonitoringReceiver.class)
Run Code Online (Sandbox Code Playgroud)

如果需要,欢迎您仍然附加一个操作字符串Intent,但您可以转储<intent-filter>(路由将基于提供的组件,在本例中为Java类).

只有<intent-filter>当您希望操作系统或第三方应用程序启动Intent自己时才会使用(执行PendingIntent您创建的应用程序不计算在内).


Xar*_*mer 28

警告"导出的接收器不需要许可"意味着,您有intent-filter一些操作(这意味着默认情况下您已android:exported="true"设置并且现在可以receive broadcasts来自您之外的任何广播公司application)因为它可以receive broadcasts来自broadcasters您应用程序之外的任何广告,它会警告您说"嘿,你确定任何广播可以调用你呢?在我看来,这是更好,如果你只允许那些broadcasters调用你有permission你已经为这个receiver通过android:permission"

您可以通过添加android:exported="false"到receiver标签来删除此警告


小智 23

如果您确实想将接收器导出到其他进程,可以在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> 
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅http://developer.android.com/training/articles/security-tips.html


nav*_*otk 5

如果像我一样,您在这里是因为使用以前的 SDK 版本构建的应用程序停止使用更新的版本,并且您希望通过最小的更改来修复它,只需添加

安卓:导出=假

到清单文件中的接收者标签。CommonsWare 的解决方案显然是长期适用的解决方案,但如果您使用自定义意图并且不打算导出它们,这可以暂时解决问题。

按照 Lubo 的方式,您需要导出此自定义权限,这会在安装前提示用户。这意味着权限的描述性文本需要写得很好,这样你才不会吓到用户改变安装应用程序的想法。此外,它还需要翻译成您所有的目标语言。