78

AndroidManifest で宣言されたレシーバーがいくつかあります。

<!-- no warning -->
<receiver
    android:name=".receivers.TriggerMonitoringBootReceiver"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

<!-- no warning -->
<receiver
    android:name=".receivers.ScanResultsReceiver"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.net.wifi.SCAN_RESULTS" />
    </intent-filter>
</receiver>

<!-- warning : Exported receiver does not require permission-->
<receiver
    android:name=".receivers.BatteryMonitoringReceiver"
    android:enabled="false">
    <intent-filter>
        <action android:name="@string/intent_action_setup_alarm" />
        <action android:name="@string/intent_action_cancel_alarm" />
        <action android:name="@string/intent_action_monitor" />
    </intent-filter>
</receiver>

最初のものは、BOOT_COMPLETEDアクションを受け取るためのものです。2 つ目は を受け取るためのものandroid.net.wifi.SCAN_RESULTSです。AlarmManager3 つ目は、私がブロードキャストしたいくつかのアクション (intent_action_monitor) と(intent_action_setup_alarm など)によってブロードキャストされたいくつかのアクションを受信するためのものです。

2 つの質問:

  • すべての受信機で警告が表示されないのはなぜですか?
  • 警告を修正するために、システム サービスから受信することを意図した受信者にどのようなアクセス許可を設定する必要がありますか (警告の内容は理解していますが、受信者を誰にも使用されたくありません)。ブートレシーバー、wifi レシーバー、アラームレシーバーなどに使用できます exported="false" ?
    カスタム権限を使用することを考えましたが、ドキュメントでは、この保護レベルカスタム権限android:protectionLevel="signatureOrSystem"の両方に対してアドバイスしています。では、この警告をどのように処理すればよいでしょうか?

ドキュメントやコードへのリンクは大歓迎です。

4

5 に答える 5

71

すべての受信機で警告が表示されないのはなぜですか?

最初の 2 つは明らかに Android でブロードキャストされるように設計されているためです。最後の 1 つは不明です。これは、文字列リソースの値を指定していないことと、独自の一意のアクション文字列であるためと考えられます。

警告を修正するために、システム サービスから受信することを意図した受信者に設定する必要があるアクセス許可は何ですか?

正しい解決策は、を削除すること<intent-filter>です。これらをブロードキャストする場合Intents、または を でラップする場合、IntentアクションgetBroadcast() PendingIntent文字列は必要ありません。IntentJava クラス オブジェクトを 2 番目のパラメーターとして受け取るコンストラクターを使用し、それを使用します。

new Intent(this, BatteryMonitoringReceiver.class)

必要に応じて、それにアクション文字列をアタッチすることIntentもできますが、ダンプすることもできます<intent-filter>(ルーティングは、提供されたコンポーネント (この場合は Java クラス) に基づきます)。

<intent-filter>OS またはサードパーティのアプリが自分自身を開始すると予想される場合にのみ、 を使用しますIntent(作成した を実行しPendingIntentてもカウントされません)。

于 2013-04-19T19:54:12.813 に答える
25

レシーバーを他のプロセスにエクスポートしたい場合は、android-manifest ファイルに独自のパーミッション定義を追加して、この警告を回避できます。

<permission
    android:name="com.yourpage.permission.YOUR_PERMISSION"
    android:protectionLevel="normal" />

<uses-permission
    android:name="com.yourpage.permission.YOUR_PERMISSION" />

<receiver <!-- warning : Exported receiver does not require permission-->
    android:name=".receivers.BatteryMonitoringReceiver"
    android:permission="com.yourpage.permission.YOUR_PERMISSION"
    android:enabled="false" >
    <intent-filter>
        <action android:name="@string/intent_action_setup_alarm" />
        <action android:name="@string/intent_action_cancel_alarm" />
        <action android:name="@string/intent_action_monitor" />
    </intent-filter>
</receiver> 

詳細については、 http://developer.android.com/training/articles/security-tips.htmlを参照してください。

于 2013-07-11T15:23:51.660 に答える