Android 13でNotification権限をリクエスト、通知を表示する

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)
        }
    }
}

上記のサンプルアプリでボタンを押すとチャンネルが作成され、システムは自動的にパーミッションリクエストポップアップを表示します。 android 13 - POST_NOTIFICATIONS request popup

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

codechachaCopyright ©2019 codechacha