我會盡我所能地概述這種情況。主要問題是:我怎樣才能動態聲明兩個接收相同廣播的接收者,但只有一個接收者有正確的權限?在我到目前爲止的測試中,由於我的應用程序持有聲明的權限,兩個接收者都獲得了廣播,而不是隻有一個接收者。測試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()
方法 結束測試
任何想法?