Я попытаюсь описать этот сценарий, а также могу. Главный вопрос: Как я могу объявить 2 приемника динамически, которые оба получают одну и ту же трансляцию, но только один имеет правильное разрешение на ее получение? В моем тестировании до сих пор оба приемника получают трансляцию из-за того, что мое приложение удерживает объявленное разрешение, а не только одно.Проверка того, что BroadcastReceiver не получает защищенную трансляцию
В приложении A я отправляю трансляцию, которую я защищаю, с новым разрешением, которое я определяю.
В приложении B я хочу убедиться, что трансляция из приложения А на самом деле защищена. Поэтому я динамически объявляю 2 приемника для того же IntentFilter
, у кого есть новое разрешение, а одно без. Однако в заявлении App B я, конечно, объявляю <uses-permission android:name="new permission" />
Однако оба приемника получают его, а не только тот, у кого есть разрешение. Я предполагаю, что это связано с тем, что объявлено, что приложение B использует это разрешение. Вот мой код:
App манифест:
<permission
android:name="com.my.custom.permission"
android:label="my_permission"
android:protectionLevel="signature" />
App Источник:
Intent intent = new Intent(SOME_CUSTOM_ACTION);
...
sendBroadcast(intent, "com.my.custom.permission");
App 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);
}
Flow:
- App установлен для Android, чтобы узнать новое разрешение установлено
- App B и запустить
- App B
start()
метод называется - Переключить на App A, чтобы вызвать отправку радиопередачу
- См. В журналах, которые оба
BroadcastReceiver
s получили по электронной почте - Окончание испытания по телефону
end()
метод
Любые идеи?