たかぎとねこの忘備録

プログラミングに関する忘備録を自分用に残しときます。マサカリ怖い。

通知に関する実行時の権限を要求するダイアログが表示されない時に考えるべきこと

launchPermissionRequest()を呼び出して、通知に関する権限の確認を行いたい場合がある。

val permission = Manifest.permission.POST_NOTIFICATIONS
val permissionState = rememberPermissionState(permission = permission)

when {
    permissionState.status.isGranted -> {
        viewModel.updateIsNotificationEnabled(it)
    }
    else -> {
        permissionState.launchPermissionRequest()
    }
}

本来想定しているのは、次のようにダイアログが表示されている状態。

しかし、これが表示されない場合があり、次のようなエラーが発生する。

None of [android.permission.POST_NOTIFICATIONS] in {}
...
Input channel object '6xxxxx com.google.android.permissioncontroller/com.android.permissioncontroller.permission.ui.GrantPermissionsActivity (client)' was disposed without first being removed with the input manager!

実は、通知に関する実行時の権限はAPIレベル33から導入されたもの。

通知に関する実行時の権限  |  Android デベロッパー  |  Android Developers

なので、APIレベル32以下のAndroid 12などの端末やエミュレーターでいくら権限を要求してもダイアログは表示されない。

そのため、顕現を要求する際は現在の実行環境のSDKバージョンを確認してから行うと良い。

import android.os.Build
...
when {
    Build.VERSION.SDK_INT >= 33 -> {
        when {
            permissionState.status.isGranted -> {
                ...
            }
            else -> {
                permissionState.launchPermissionRequest()
                ...
            }
        }
    }
    else -> {
        ...
    }
}

参考

How can I check the system version of Android? - Stack Overflow

java - Android permission doesn't work even if I have declared it - Stack Overflow