Обеспечение прав на андроид в одном приложении

Вот сценарий. Мое приложение имеет

  • BroadcastSenderActivity
  • SampleBroadcastReceiver

Я использую метод sendBroadcast(intent, permission) для отправки своей трансляции, потому что я хочу, чтобы только мой SampleBroadcastReceiver получал широковещательное сообщение и не позволял другим получателям в моем приложении получать сообщение.

Примечание. Все приемники зарегистрированы для одного и того же действия, но во время трансляции на основе системных условий сообщение будет транслироваться с различными разрешениями.

Из документации я узнал, что в манифесте мне нужно следующее:

  1. Необходимо объявить <permission android:name="com.example.MYPERMISSION" android:label="my_permission" android:protectionLevel="normal"></permission> в манифесте

  2. Попросите эту stmt запросить разрешение, которое находится на уровне приложения <uses-permission android:name="com.example.MYPERMISSION"/>

ВОПРОС

  • Вместо запроса разрешения на уровне приложения, как я могу запросить разрешение только для определенного компонента в моем приложении? например. SampleBroadcastReceiver (см. Код ниже). Является ли это возможным?*

  • Какова цель <android-permission> , доступного для всех отдельных компонентов? Может ли это служить моей цели?

    AndroidManifest

      ......... 

     <activity android:name="com.example.activities.BroadcastSenderActivity" android:label="BroadcastSenderActivity" android:theme="@android:style/Theme.Light" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- ************************************** RECEIVER ******************************************* --> <receiver android:name="com.example.broadcastTest.SampleBroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="com.example.ACTION_BROADCAST_SEND" /> </intent-filter> </receiver> <receiver android:name="com.example.broadcastTest.BroadcastReceiver_1" android:exported="false"> <intent-filter> <action android:name="com.example.ACTION_BROADCAST_SEND" /> </intent-filter> </receiver> <receiver android:name="com.example.broadcastTest.BroadcastReceiver_2" android:exported="false"> <intent-filter> <action android:name="com.example.ACTION_BROADCAST_SEND" /> </intent-filter> </receiver> 

  public class BroadcastSenderActivity extends Activity { public BroadcastSenderActivity() { } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(Logger.TAG, "BroadcastSenderActivity - onCreate"); setContentView(R.layout.broadcast_tester); Button btn = (Button)findViewById(R.id.sendBroadcastBtn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent broadcastIntent = new Intent(); Log.d(Logger.TAG, "BroadcastSenderActivity - sending the broadcast"); broadcastIntent.setAction(com.example.ACTION_BROADCAST_SEND); BroadcastSenderActivity.this.sendBroadcast(broadcastIntent, com.example.MYPERMISSION); 

Вы можете защитить каждый отдельный компонент с определенным разрешением. Это атрибут android:permission="..." который может применяться к каждому компоненту отдельно. Это позволяет вам требовать разные разрешения, например, запускать конкретное действие, запускать определенную Service или использовать конкретный BroadcastReceiver . Этот атрибут указывает, что приложение должно удерживать указанное разрешение, чтобы использовать конкретный компонент.

Приложение имеет набор разрешений. Эти разрешения запрашиваются в манифесте тегами <uses-permission> . Пользователь отображается в этом списке, когда приложение установлено, и при установке эти разрешения предоставляются после установки .

Когда вы отправляете широковещательную рассылку, обычно все установленные и / или зарегистрированные BroadcastReceiver могут видеть эту трансляцию. Когда вы используете метод sendBroadcast(intent, permission) параметр permission используется, чтобы контролировать, какие приемники могут видеть трансляцию. Однако эта проверка разрешений также выполняется на уровне приложения . Это означает, что если приложению было предоставлено указанное разрешение, все BroadcastReceiver этого приложения смогут видеть трансляцию.

Поэтому то, что вы хотите сделать, невозможно с помощью механизма разрешения Android. Поскольку приложение имеет или не имеет конкретного разрешения, вы не можете иметь мелкомасштабный контроль над тем, какие компоненты могут использоваться конкретным приложением.

Надеюсь, это ответит на ваш вопрос.

EDIT: Альтернативное предложение:

Поскольку это все в одном приложении, вы должны иметь возможность управлять этим самостоятельно. Лично я считаю, что использование рамок для Android для этого является излишним. Вы можете просто добавить дополнительный дополнительный ресурс в Intent и использовать его для контроля доступа к приемникам. Или вы можете определить 2 разных действия Intent и использовать их для контроля доступа.