我会尽我所能地概述这种情况。主要问题是:我怎样才能动态声明两个接收相同广播的接收者,但只有一个接收者有正确的权限?在我到目前为止的测试中,由于我的应用程序持有声明的权限,两个接收者都获得了广播,而不是只有一个接收者。测试BroadcastReceiver没有收到受保护的广播
在应用程序A中,我发送了一个广播,我正在使用我定义的新许可进行保护。
在应用B中,我想确保应用A的广播实际上受到保护。所以我动态地声明了两个接收器的相同IntentFilter
,一个持有新的权限,另一个没有。然而,在应用B的清单中,我当然声明<uses-permission android:name="new permission" />
但是,两个接收者都获取它,而不是只有持有该权限的人。我认为这是因为应用程序B本身被声明使用权限。这里是我的代码:
应用程序的清单:
<permission
android:name="com.my.custom.permission"
android:label="my_permission"
android:protectionLevel="signature" />
应用程序源:
Intent intent = new Intent(SOME_CUSTOM_ACTION);
...
sendBroadcast(intent, "com.my.custom.permission");
应用B清单:
<uses-permission android:name="com.my.custom.permission" />
应用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的学习新的权限安装
- 应用B和运行
- 应用B
start()
方法被称为 - 切换到App A到触发发送广播
- 在日志中看到
BroadcastReceiver
被称为 - 通过调用
end()
方法 结束测试
任何想法?