1. ホーム
  2. android

android - システムサービスからの受信を意図したレシーバで「エクスポートされたレシーバは許可を必要としません。

2023-09-12 23:20:09

質問

AndroidManifestで、いくつかのReceiverを宣言しています。

<!-- 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 アクションを受け取ります。二つ目は android.net.wifi.SCAN_RESULTS . 3つ目は、私がブロードキャストしたいくつかのアクション (intent_action_monitor) を受け取るためのものであり、また AlarmManager (intent_action_setup_alarm など) を受信します。

2つの質問です。

  • なぜすべての受信機で警告が表示されないのですか?
  • どのようなパーミッションを設定する必要がありますか? を設定すれば、警告を修正できます。 (私はそれが何であるかを理解し、とにかく誰にも私のレシーバを使用して欲しくありません) ? ウィル exported="false" する ブートレシーバー、Wifiレシーバー、アラームレシーバーなどのための ?

    でカスタムパーミッションを使おうと思ったのですが android:protectionLevel="signatureOrSystem" を使うことも考えましたが、ドキュメントによると、この 保護レベル カスタムパーミッション . この警告をどのように処理すればよいのでしょうか?

ドキュメントやコードへのリンクは非常にありがたいものです。

どのように解決するのですか?

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

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

警告を修正するために、システム サービスから受信することを意味するレシーバーにどのような権限を設定する必要がありますか。

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

new Intent(this, BatteryMonitoringReceiver.class)

アクション文字列をこの Intent を捨て去ることができます。 <intent-filter> を捨てることができます (ルーティングは供給されたコンポーネント、この場合はJavaクラスに基づいて行われます)。

のみを使用します。 <intent-filter> を使うのは、OS やサードパーティアプリが Intent を実行する)。 PendingIntent の実行はカウントされません)。