7

Android のセキュリティ モデルを考慮して、ブロードキャスト レシーバーでカスタム アクセス許可を使用しようとしています。

私がやったこと

受信機のカスタム許可を宣言したため、受信できるブロードキャストが制限されています。マニフェストからのいくつかのコード:

<permission android:name="abc"/>

<receiver android:name=".UpdateUserReceiver"
        android:permission="abc"
        android:enabled="true"
        android:exported="false">

        <intent-filter>
            <action android:name="android.intent.action.ACTION_UPDATE_USERNAME"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
</receiver>

ここで、レシーバーUpdateUserReceiverは、アクセス許可「abc」を使用するコンポーネントからのブロードキャストのみを受信することを期待しています。

ブロードキャスト送信コード:

// Update username. Invoke broadcast.
Intent updateUserBroadcast = new Intent();
updateUserBroadcast.putExtra("username", userName);
updateUserBroadcast.setAction("android.intent.action.ACTION_UPDATE_USERNAME");
sendBroadcast(updateUserBroadcast);

ブロードキャストを送信するアクティビティ:

<activity android:name=".UpdateUserNameActivity">

        <intent-filter>
            <action android:name="com.intent.action.UPDATE_USERNAME"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
</activity>

質問 1 : ご覧のとおり、アクティビティは、アクティビティからのブロードキャストを受信できるように、受信者が宣言したパーミッションをどこにも使用しません。しかし、それでもレシーバーが呼び出されます。よくわかりませんが、暗黙のインテントの使用が原因であると思われます。何か案は?

質問 2 : アプリ レベルで宣言されたパーミッション タグと、レシーバー内の android:permission タグの違いは何ですか? 受信者がブロードキャストを受信することを誰もが期待できるようになる前に許可を強制する2番目の使用を理解していますが、なぜ最初のものが必要なのですか。このシナリオに必要ですか、それとも削除できますか。いずれにせよ、受信機がブロードキャストを受信することを確認しました。

4

3 に答える 3

3

回答 1 :
<uses-permission>タグは<manifest>、このアプリケーションのすべてのコンポーネントのアクセス許可を要求します。単一のアクティビティのアクセス許可を要求する必要はありません。そして、アプリケーションは、カスタム許可の使用<permission>が自動的にすべて保持されることを宣言し、再度要求する必要はありません。
あなたの活動と受信者は同じアプリケーションにあると思います。
「暗黙のインテント」は「パーミッション ルール」を破ることはできません。

回答 2 :アプリケーション
のすべてのコンポーネントに適用されるアクセス許可を設定します<permission>。 ここをチェックしてください: http://developer.android.com/guide/topics/manifest/application-element.html#prmsn<application>

于 2015-12-07T02:58:46.903 に答える
2

しかし、それでもレシーバーが呼び出されます。よくわかりませんが、暗黙のインテントの使用が原因であると思われます

いいえ。

何か案は?

それらは両方とも同じアプリにあります(「ここで私のアクティビティとレシーバーが同じアプリケーションにあるため」)。アクセス許可は、アプリ内ではなく、プロセス間通信 (IPC) の一部としてアプリ間で適用されます。

アプリ レベルで宣言されたパーミッション タグと、レシーバー内の android:permission タグの違いは何ですか?

<permission>パーミッションを定義します。android:permissionパーミッションを適用します。Java のアナロジーを描くに<permission>は、フィールドを定義し、フィールドをandroid:permission使用します。

于 2015-12-13T00:46:26.693 に答える
1

わかりました。同じアプリケーションからブロードキャストを送信している可能性があります。別のアプリからブロードキャストを送信しようとしましたか? このコードを見てください。呼び出し元の PID が同じアプリである場合は PID チェックがあり、デフォルトで権限が付与されます。したがって、レシーバーは問題なく実行されます。 http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/java/android/app/ActivityManager.java#2109

于 2015-12-11T14:37:54.357 に答える