2015-10-23 3 views
0

Я попытаюсь описать этот сценарий, а также могу. Главный вопрос: Как я могу объявить 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:

  1. App установлен для Android, чтобы узнать новое разрешение установлено
  2. App B и запустить
  3. App B start() метод называется
  4. Переключить на App A, чтобы вызвать отправку радиопередачу
  5. См. В журналах, которые оба BroadcastReceiver s получили по электронной почте
  6. Окончание испытания по телефону end() метод

Любые идеи?

ответ

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 сек на 2 отдельных приложений, один с использованием разрешения и один без.