1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BroadcastReceiver では exported 動作を指定する必要がある

Posted at

概要

実行時に登録されるブロードキャスト レシーバでは、エクスポート動作を指定する必要がある

Android 14(API レベル 34)以降をターゲットとし、コンテキスト登録されたレシーバを使用するアプリとサービスでは、レシーバをデバイス上のすべてのアプリにエクスポートするかどうかを示すフラグ(それぞれ RECEIVER_EXPORTED または RECEIVER_NOT_EXPORTED)を指定する必要があります。この要件は、Android 13 で導入されたこれらのレシーバー用の機能を利用して、アプリをセキュリティの脆弱性から保護するのに役立ちます。

対応

殆どの場合、他のアプリからのBroadcastを受けとって何か処理を実行するような連携動作を行うことはないので、RECEIVER_NOT_EXPORTED で問題はない。Android13から利用できるので、以下のように切り分けて呼び出す。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
   registerReceiver(broadcastReceiver, intentFilter, RECEIVER_NOT_EXPORTED)
}else {
   registerReceiver(broadcastReceiver, intentFilter)
}

注意点

公式にも記載があるように、システムからのbroadcastを受け取る場合は指定しないようにする必要がある。例えばWi-Fiの接続状態やスクリーン、バッテリー状態など。多くのシステムbroadcastは上記のようにRECEIVER_NOT_EXPORTED を指定しても受け取れる仕様のようだが、いくつかのシステムbroadcastは受け取れないバグ(?)があるようなので注意が必要。動作的にはRECEIVER_EXPORTEDに変更すると、これらも受信できたが、公式的には無指定にするようにとのこと。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?