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
如果像我一样,您在这里是因为使用以前的 SDK 版本构建的应用程序停止使用更新的版本,并且您希望通过最小的更改来修复它,只需添加
安卓:导出=假
到清单文件中的接收者标签。CommonsWare 的解决方案显然是长期适用的解决方案,但如果您使用自定义意图并且不打算导出它们,这可以暂时解决问题。
按照 Lubo 的方式,您需要导出此自定义权限,这会在安装前提示用户。这意味着权限的描述性文本需要写得很好,这样你才不会吓到用户改变安装应用程序的想法。此外,它还需要翻译成您所有的目标语言。
| 归档时间: |
|
| 查看次数: |
36962 次 |
| 最近记录: |