【发布时间】:2016-03-09 05:14:28
【问题描述】:
鉴于 Android 中的安全模型,我正在尝试对广播接收器使用自定义权限。
我做了什么:
我已经为接收者声明了一个自定义权限,从而限制了它可以接收的广播。清单中的一些代码:
<permission android:name="abc"/>
<receiver android:name=".UpdateUserReceiver"
android:permission="abc"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.ACTION_UPDATE_USERNAME"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
现在我希望接收器 UpdateUserReceiver 只会接收来自使用权限“abc”的组件的广播。
广播发送代码:
// Update username. Invoke broadcast.
Intent updateUserBroadcast = new Intent();
updateUserBroadcast.putExtra("username", userName);
updateUserBroadcast.setAction("android.intent.action.ACTION_UPDATE_USERNAME");
sendBroadcast(updateUserBroadcast);
发送广播的活动:
<activity android:name=".UpdateUserNameActivity">
<intent-filter>
<action android:name="com.intent.action.UPDATE_USERNAME"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
问题 1: 可以看出,活动在任何地方都没有使用接收者声明的权限,因此它可以接收来自活动的广播。但是仍然调用了接收器,我怀疑这是由于使用了隐式意图,尽管我不确定。有什么想法吗?
问题 2: 在应用程序级别声明的权限标记和接收器内部的 android:permission 标记有什么区别?我理解第二个的使用,它在任何人都可以期望接收者接收广播之前强制执行许可,但是为什么需要第一个。这种情况是否需要它,或者可以将其删除。无论哪种方式,我都检查了接收器是否接收到广播。
【问题讨论】:
-
minSdkVersion 是 19,targetSdkVersion 是 23,我的目标是 x86 Kitkat Android 模拟器。
-
据我了解,android系统会验证receiver是否有权限接收广播。但在你的情况下,你期望它以另一种方式工作,这就是我认为你的接收器被执行的原因。
-
如果您只想在受信任的应用程序发送广播时执行您的接收器,那么您可以进行定向广播。如果这是您正在寻找的内容,请告诉我,我会给您更多信息。
-
@7383,关于您的评论 1,如果我删除了外部权限,只保留接收器内部的权限,那么广播者必须拥有该权限才能向该接收器发送广播。但是该活动仍然能够在没有权限的情况下向该接收器发送广播。检查此链接:developer.android.com/guide/topics/manifest/…
-
@7383,关于评论 2,这不是您会遇到的常见情况,因为这里我的活动和接收者在同一个应用程序中。我只想确认 Android 的权限模型是否仅适用于单独的应用程序。另外,我不介意您分享有关定向广播的信息。谢谢。
标签: android broadcastreceiver android-permissions android-security