【发布时间】:2015-10-23 22:31:09
【问题描述】:
我会尽量概述这个场景。主要问题是:如何动态声明 2 个接收器,它们都接收相同的广播,但只有一个具有正确的接收权限?到目前为止,在我的测试中,两个接收器都收到了广播,因为我的应用程序持有声明的权限,而不仅仅是一个。
在应用程序 A 中,我正在发送一个我正在使用我定义的新权限保护的广播。
在 App B 中,我想确保来自 App A 的广播实际上受到保护。所以我动态地为同一个IntentFilter 声明了两个接收者,一个持有新权限,一个没有。但是,在 App B 的清单中,我当然声明了<uses-permission android:name="new permission" />
但是,两个接收者都得到了它,而不仅仅是持有许可的那个。我认为这是因为 App B 本身被声明为使用该权限。这是我的代码:
应用 A 清单:
<permission
android:name="com.my.custom.permission"
android:label="my_permission"
android:protectionLevel="signature" />
应用 A 来源:
Intent intent = new Intent(SOME_CUSTOM_ACTION);
...
sendBroadcast(intent, "com.my.custom.permission");
应用 B 清单:
<uses-permission android:name="com.my.custom.permission" />
App B 服务:
private BroadcastReceiver rNoPermission = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (SOME_CUSTOM_ACTION.equals(intent.getAction())) {
Log.d(TAG, "receiver was able to receive without permission");
}
}
};
private BroadcastReceiver rYesPermission = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (SOME_CUSTOM_ACTION.equals(intent.getAction())) {
Log.d(TAG, "receiver was able to receive properly with permission");
}
}
};
public void start() {
IntentFilter filter = new IntentFilter(SOME_CUSTOM_ACTION);
registerReceiver(rNoPermission, filter); // purposely don't register with permission
registerReceiver(rYesPermission, filter, "com.my.custom.permission", null);
}
public void end() {
unregisterReceiver(rNoPermission);
unregisterReceiver(rYesPermission);
}
流程:
- 为 Android 安装应用 A 以获取新权限
- 应用 B 已安装并运行
- App B
start()方法被调用 - 切换到 App A 触发发送广播
- 在日志中查看
BroadcastReceivers 都被调用 - 调用
end()方法结束测试
有什么想法吗?
【问题讨论】:
标签: android broadcastreceiver android-broadcast