Android 13の変更として、通知に関する実行時の権限が導入されました。
アプリの動作にどのような影響を与えるかを詳しく見てみましょう。
1. Android 13のNotificationランタイム権限
Android 12までは、アプリをインストールするとデフォルトでNotificationを表示することができました。ユーザーは、App Info 画面で Notification を無効にしなければ、アプリの Notification の送信を防ぐことができました。
Android 13でNotificationランタイム権限が追加され、この権限でアプリのNotification送信権限を制御できるように変更されました。 また、デフォルトではRuntime permissionはOFFなので、アプリはユーザーにこの権限を受け取るまで通知を送信できません。
2. 権限宣言と権限要求 (Target SDK API 33 以降)
Target API 33以降のAppは、次のようにAndroidManifestでPOST_NOTIFICATIONS権限を宣言できます。
<manifest ...>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<application ...>
...
</application>
</manifest>
アプリでユーザーに POST_NOTIFICATIONS 権限をリクエストすると、次のように実装できます。 基本的な Runtime permission 要求方法と同じです。
requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), REQUEST_CODE)
ユーザーにRuntime permissionを要求する方法については、Android開発者のアプリ権限の要求を参照してください。
3. 権限宣言と権限要求(Target SDK API 32 以下)
POST_NOTIFICATIONS権限はAndroid 13(API 33)で追加されたため、Android 12L(API 32)以下にコンパイルされたアプリにはパーミッションが追加されていません。 そのため、システムは自動的にアプリに権限を追加し、パーミッションリクエストのポップアップも表示します。
Target API 32以下のアプリがAndroid 13デバイスにインストールされている場合、デフォルトではPOST_NOTIFICATIONS権限はアプリが使用すると自動的に宣言されます。
自動的にパーミッションは宣言はされていますが、パーミッションが自動的に付与されるわけではありません。パーミッションを付与するには、権限の要求ポップアップを通じてユーザーに権限を取得する必要があります。
パーミッション宣言と同様に、API 32以前のアプリにはPOST_NOTIFICATIONSに対してパーミッションを要求するコードはありません。 そのため、システムは以下の場合に自動的にパーミッションポップアップを表示し、ユーザーから権限を付与できるようにします。
- Notification Channel が登録された状態で App が Launcher で実行されたときに権限要求ポップアップ
- アプリがランチャーで実行された後、通知チャネルを登録したときに権限要求ポップアップフット
つまり、API 32以前のアプリは、次のコードでNotification Channelが生成されたとき、またはNotificationの作成後にアプリが実行されると、パーミッションリクエストポップアップが自動的に発生します。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btn : TextView = findViewById(R.id.myBtn)
btn.setOnClickListener {
createNotificationChannel(this)
}
}
private fun createNotificationChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = "my-notification-channel"
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channelId = "${context.packageName}-$name"
val channel = NotificationChannel(channelId, name, importance)
channel.description = "my notification channel description"
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}
}
上記のサンプルアプリでボタンを押すとチャンネルが作成され、システムは自動的にパーミッションリクエストポップアップを表示します。
API 32以下のアプリの場合、システムが自動的にパーミッションポップアップを表示したときに、ユーザーが
Don't allow
ボタンを一度押すと、アプリが再起動してもポップアップは発生しません。
API 33以降のアプリの場合、アプリがパーミッションポップアップを表示したときに、ユーザーが
Don't allow
ボタンを2回押すまでパーミッションポップアップを引き続き表示できます。基本的なランタイム許可ポリシーに従います。
サンプルアプリはGitHub - create notification channelにあります。
4. アプリのアップデートに与える影響
Android 12にTarget API 32以前のアプリがインストールされ、デバイスがAndroid 13にアップグレードされたとします。アプリの動作にどのような違いがありますか?
4.1 AppのNotification設定を無効にした状態でAndroid 13にアップグレードする
ユーザーがAndroid 12でNotificationを使用しないように設定を変更したため、Android 13にアップグレードするとデフォルトで POST_NOTIFICATIONS
権限はオフになります。
4.2 App の Notification 設定が有効な状態で Android 13 にアップグレード
Android 12でNotification設定が有効なため、Android 13にアップグレードするとデフォルトで POST_NOTIFICATIONS
権限はオンになります。したがって、追加の権限を要求せずに通知を表示できます。
5. まとめ
アプリをインストールするときにユーザーの同意なしにNotificaitonを表示する動作のため、一部のユーザーは疲れを感じました。 Android 13のNotificationパーミッションの導入は、このようなユーザーの経験を反映したと思います。
これまでアプリはデフォルトでNotificaitonを表示でき、不便なユーザーが設定からoffに変更した場合、現在はデフォルトでNotificaitonを表示できなくなり、表示したいアプリがユーザーに許可を与えるようにUXが変更されました。
アプリの動作に関して、
- API 32以下にコンパイルされたアプリは、Android 13でプラットフォームが自動的に権限を追加し、リクエストポップアップを表示します。しかし、自由度が落ちるので、なるべくAPI 33に変更し、アプリが自分で望むタイミングに権限ポップアップを表示するのが良いようです
- API 33以降のアプリは自分で権限ポップアップを表示でき、ユーザーが2回以上権限を拒否した場合は、設定で直接設定するようにガイドできます。
- デバイスが Android 12 から 13 にアップグレードされると、Android 12 の Notification 設定に従って POST_NOTIFICATIONS の許可をデフォルトで許可または拒否に変更します
Related Posts
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - adbコマンドでActivity実行
- アンドロイド - MediaStoreにメディアファイルを保存する方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android11 - Storage(ストレージ)の変更まとめ
- Jetpack Compose - RowとColumn
- Android 13 - 細かいメディアファイルの権限
- Android 13でNotification権限をリクエスト、通知を表示する
- エラー解決:android gradle plugin requires java 11 to run. you are currently using java 1.8.
- Query method parameters should either be a type that can be converted into a database column or a List
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - adbコマンドで特定のパッケージのプロセスの終了
- Android - adb push、pullでファイルのコピー、ダウンロード
- Android - adbコマンドでsettings value確認、変更、
- Android 12 - IntentFilterのexported明示的な宣言
- Android - adb logcatコマンドでログ出力
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - Foreground Service実行
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - アプリの権限を確認(Permission check)
- Android - adbで実行中のプロセス、スレッドリスト及びメモリ情報の確認
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Cleartext HTTP ... not permitted例外解決方法
- Androidのビルドエラー - Calls to Java default methods are prohibited in JVM target 1.6
- アンドロイド - Assetsでファイルを読み取る方法
- アンドロイドのさまざまなNotification種類と実装方法
- アンドロイド - INSTALL_FAILED_TEST_ONLYエラー解決方法
- Android EspressoのCustom Matcher実装方法
- Android Espressoを使用してUIをテストする方法(3)
- アンドロイド - CTS hostsideをgradleで構築する方法
- Androidのアプリのデータフォルダーのパスと内部/外部ストレージ説明
- アンドロイド - 最初のApp作成
- Androidをインストールする方法(Windows)