2015-10-23 61 views
0

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

流量:

  1. 應用程式安裝Android的學習新的權限安裝
  2. 應用B和運行
  3. 應用B start()方法被稱爲
  4. 切換到App A到觸發發送廣播
  5. 在日誌中看到BroadcastReceiver被稱爲
  6. 通過調用end()方法
  7. 結束測試

任何想法?

回答

0

實現了我的錯誤所在。權限是在應用程序級別授予的,而不是在組件級別授予的。根據Android文檔:

要在發送時強制執行權限,請向sendBroadcast(Intent, String)sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)提供非空權限參數。只有已經被授予此權限的接收者(通過在AndroidManifest.xml中使用標籤請求它)才能夠接收廣播。

(來源:http://developer.android.com/reference/android/content/BroadcastReceiver.html

和:

的意圖的

傳送者可以確認接收者具有權限指定與所述方法調用一個非空權限。只有擁有該權限的應用程序纔會收到該意圖。

(來源:http://developer.android.com/training/articles/security-tips.html

所以截至目前似乎沒有成爲一個辦法做我上面提到不使用許可和一個分裂BroadcastReceiver s轉換2級獨立的應用程序,一個沒有。