Как использовать Compose Accompanist для работы с новыми разрешениями на старых устройствах?

Использование разрешений 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
    )

Есть ли лучшее решение, чем упомянутое выше?

1
0
588
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Есть лучший обходной путь:

 val permissionState = rememberMultiplePermissionsState(
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        listOf(Manifest.permission.POST_NOTIFICATIONS)
    } else {
        // permission not needed
        emptyList()
    }
 )

Спасибо за альтернативное решение, Дерек. Оба решения, по-видимому, работают на практике, основная разница заключается в том, хотите ли вы использовать PermissionState или MultiplePermissionsState - последнее немного более сложное, вращающееся вокруг (несуществующего) набора, а не одного (потенциально недействующего) PermissionStatus.

Casper Bang 17.03.2024 07:52

А как насчет фиктивного, всегда предоставляемого, резервного 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

Это позволяет иметь дело с этим разрешением, которое зависит от версии ОС, в которой оно используется, без:

  • Представляем еще одно разрешение, которое может не потребоваться для приложения, но его необходимо будет указать в Manifest
  • Добавление ненужной сложности MultiplePermissionsState

В версиях, на которые распространяется разрешение, rememberPermissionState будет выполнять свою работу, как и ожидалось, в то время как в других проверка разрешения с использованием permissionState.status.isGranted (см. ссылку, указанную в вопросе) всегда будет возвращать true.

Спасибо @Yunnosch за вашу любезную помощь в том, чтобы сделать мой первый ответ более приемлемым, чем его краткость.

Djé 31.05.2024 23:27

Не за что. Пожалуйста, перефразируйте еще раз, чтобы не сложилось впечатление, что вы задаете вопрос, а не отвечаете. В остальном хорошая работа над улучшением вашего поста.

Yunnosch 01.06.2024 07:10

Другие вопросы по теме