3

これがシナリオです。私のアプリは

  • 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>すべての個々のコンポーネントで使用できるタグの目的は何ですか? それは私の目的を果たすことができますか?

    Androidマニフェスト

        .........
    

    <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);
4

1 に答える 1

7

特定のアクセス許可を使用して、個別のコンポーネントをそれぞれ保護できます。これは、android:permission="..."各コンポーネントに個別に適用できる属性です。これにより、たとえば、特定Activityの を起動する、特定の を開始する、Serviceまたは特定の を使用するなど、さまざまな権限を要求できますBroadcastReceiver。この属性は、アプリケーションが特定のコンポーネントを使用するために指定された許可を保持する必要があることを示します。

アプリケーションは一連の権限を保持します。これらのアクセス許可は、<uses-permission>タグによってマニフェストで要求されます。アプリケーションのインストール時にこのリストがユーザーに表示され、アプリケーションにはインストール時にこれらの権限が付与されます。

ブロードキャストを送信すると、通常、インストール済みまたは登録済みBroadcastReceiverのすべての がこのブロードキャストを見ることができます。このメソッドを使用する場合sendBroadcast(intent, permission)permissionパラメーターを使用して、ブロードキャストを表示できるレシーバーを制御します。ただし、この権限チェックはアプリケーション レベルでも行われます。これは、アプリケーションが指定された許可を与えられている場合、そのアプリケーションのすべてがBroadcastReceiverブロードキャストを見ることができることを意味します。

したがって、あなたがしたいことは、Android 許可メカニズムを使用して行うことはできません。アプリケーションには特定の権限がある場合とない場合があるため、特定のアプリケーションで使用できるコンポーネントを細かく制御することはできません。

うまくいけば、これはあなたの質問に答えます。

編集:代替提案:

これはすべて単一のアプリケーション内にあるため、自分で管理できるはずです。個人的には、これに Android パーミッション フレームワークを使用するのはやり過ぎだと思います。ブロードキャストに適切なエクストラIntentを追加するだけで、それを使用して受信機へのアクセスを制御できます。Intentまたは、2 つの異なるアクションを定義し、それを使用してアクセスを制御することもできます。

于 2013-05-29T14:16:12.057 に答える