概要
実行時に登録されるブロードキャスト レシーバでは、エクスポート動作を指定する必要がある
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
に変更すると、これらも受信できたが、公式的には無指定にするようにとのこと。