Использование разрешений Jetpack Compose из библиотеки разрешений аккомпаниатора (https://google.github.io/accompanist/permissions/) — хороший способ реагирования. Однако мне неясно, как быть с разрешениями, которые зависят от версии ОС, в которой она используется.
Например, отказ от уведомлений изменился в Android Tiramisu/33, и теперь он включается с использованием разрешения POST_NOTIFICATIONS. Тогда вопрос в том, как вы используете
val permissionState: PermissionState = rememberPermissionState(
permission = Manifest.permission.POST_NOTIFICATIONS
)
...когда на API POST_NOTIFICATIONS нельзя ссылаться, скажем, на Android 9. Единственный обходной путь, который я могу придумать, который выглядит как взлом, - это вернуться к некоторому другому разрешению, которое автоматически предоставляется по умолчанию, то есть ИНТЕРНЕТ. разрешение. Вот так:
val permissionState: PermissionState = rememberPermissionState(
permission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
Manifest.permission.POST_NOTIFICATIONS else Manifest.permission.INTERNET
)
Есть ли лучшее решение, чем упомянутое выше?
Есть лучший обходной путь:
val permissionState = rememberMultiplePermissionsState(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
listOf(Manifest.permission.POST_NOTIFICATIONS)
} else {
// permission not needed
emptyList()
}
)
А как насчет фиктивного, всегда предоставляемого, резервного PermissionState ?
val permittedState = object : PermissionState {
override val permission: String = ""
override val status: PermissionStatus = PermissionStatus.Granted
override fun launchPermissionRequest() { }
}
val permissionState = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
rememberPermissionState(Manifest.permission.POST_NOTIFICATIONS) } else permittedState
Это позволяет иметь дело с этим разрешением, которое зависит от версии ОС, в которой оно используется, без:
ManifestMultiplePermissionsStateВ версиях, на которые распространяется разрешение, rememberPermissionState будет выполнять свою работу, как и ожидалось, в то время как в других проверка разрешения с использованием permissionState.status.isGranted (см. ссылку, указанную в вопросе) всегда будет возвращать true.
Спасибо @Yunnosch за вашу любезную помощь в том, чтобы сделать мой первый ответ более приемлемым, чем его краткость.
Не за что. Пожалуйста, перефразируйте еще раз, чтобы не сложилось впечатление, что вы задаете вопрос, а не отвечаете. В остальном хорошая работа над улучшением вашего поста.
Спасибо за альтернативное решение, Дерек. Оба решения, по-видимому, работают на практике, основная разница заключается в том, хотите ли вы использовать PermissionState или MultiplePermissionsState - последнее немного более сложное, вращающееся вокруг (несуществующего) набора, а не одного (потенциально недействующего) PermissionStatus.