0Pricing
Android Academy · Урок

Запрос разрешений в Compose

Используйте API Accompanist или activity result

«Запрос разрешений в Compose» — бесплатный урок Android Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Запрос разрешений в Compose

В Jetpack Compose разрешения во время работы приложения запрашиваются с помощью API результатов действий, обёрнутого в rememberLauncherForActivityResult. Это позволяет не использовать старый обратный вызов onRequestPermissionsResult.

Контракт RequestPermission

API результатов действий использует контракты, определяющие входные и выходные данные. ActivityResultContracts.RequestPermission() принимает строку с разрешением и возвращает результат выдачи в виде Boolean.

Создание средства запуска

rememberLauncherForActivityResult создаёт средство запуска, связанное с композицией. Вы передаёте ему контракт и обратный вызов, который получает результат.

val launcher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.RequestPermission()
) { isGranted ->
    if (isGranted) {
        // permission granted, use the feature
    } else {
        // permission denied
    }
}

Запуск запроса

Вызовите launcher.launch, передав нужное разрешение. Система покажет диалог, а Ваш обратный вызов сработает с выбором пользователя.

Button(onClick = {
    launcher.launch(Manifest.permission.CAMERA)
}) {
    Text("Enable Camera")
}

Проверяйте перед запросом

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

val context = LocalContext.current
val alreadyGranted = ContextCompat.checkSelfPermission(
    context, Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED

Отслеживание состояния в Compose

Храните текущий статус разрешения в состоянии, чтобы интерфейс мог реагировать на его изменения. Обновляйте его внутри обратного вызова средства запуска.

var hasCamera by remember {
    mutableStateOf(
        ContextCompat.checkSelfPermission(
            context, Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    )
}

val launcher = rememberLauncherForActivityResult(
    ActivityResultContracts.RequestPermission()
) { granted -> hasCamera = granted }

Запрос нескольких разрешений

Чтобы запросить сразу несколько разрешений, используйте контракт RequestMultiplePermissions. Обратный вызов получает соответствие между разрешениями и статусами их выдачи.

val multi = rememberLauncherForActivityResult(
    ActivityResultContracts.RequestMultiplePermissions()
) { results ->
    val fineLocation = results[Manifest.permission.ACCESS_FINE_LOCATION] == true
}

multi.launch(
    arrayOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION
    )
)

Управление интерфейсом из состояния

Показывайте разное содержимое в зависимости от состояния разрешения: если оно выдано, показывайте функцию; в противном случае — кнопку для запроса разрешения. Так экран остаётся реактивным и понятным.

if (hasCamera) {
    CameraPreview()
} else {
    Button(onClick = { launcher.launch(Manifest.permission.CAMERA) }) {
        Text("Grant camera access")
    }
}

Вариант с библиотекой Accompanist Permissions

Библиотека Accompanist Permissions предлагает вспомогательные средства более высокого уровня, например rememberPermissionState. Многие команды предпочитают использовать исходный API результатов действий, чтобы не добавлять лишнюю зависимость; оба варианта подходят.

Не запрашивайте разрешение при запуске

Не запрашивайте разрешение сразу после появления экрана. Дождитесь, пока пользователь нажмёт кнопку действия, которому явно требуется это разрешение. Запросы в подходящем контексте получают значительно больше согласий.

Учитывайте изменения конфигурации

rememberLauncherForActivityResult сохраняется при рекомпозиции, а платформа API результатов действий корректно доставляет результаты даже после изменений конфигурации, например поворота экрана. Вам не нужно управлять этой служебной логикой самостоятельно.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли запрос разрешений.

Повторение

Вы научились запрашивать разрешения современным способом:

  • Используйте rememberLauncherForActivityResult с контрактом RequestPermission
  • Сначала выполните проверку, затем вызовите launcher.launch(permission)
  • Храните статус разрешения в состоянии, чтобы управлять интерфейсом
  • Для одновременного запроса нескольких разрешений используйте RequestMultiplePermissions

Далее: обработка отказов и показ пояснений.

Часто задаваемые вопросы

Урок «Запрос разрешений в Compose» бесплатный?

Да — полный текст урока «Запрос разрешений в Compose» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «Запрос разрешений в Compose»?

Используйте API Accompanist или activity result Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Запрос разрешений в Compose»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Модель разрешений Android
  2. Запрос разрешений в Compose
  3. Обработка отказов и объяснение причин
  4. Рекомендации по конфиденциальности
← Назад к Android Academy