Запросить разрешения на использование оборудования для аудио- и дисплейных очков.

Применимые устройства XR
Данное руководство поможет вам создавать приложения для устройств XR такого типа.
Аудио и
Очки для демонстрации

Как и на телефоне, доступ к конфиденциальным аппаратным средствам, таким как камера и микрофон, в аудиоочках и очках с дисплеем требует явного согласия пользователя. Эти разрешения считаются специфическими для очков , и ваше приложение должно запрашивать их во время выполнения, даже если у него уже есть соответствующие разрешения на телефоне.

Укажите права доступа в манифесте вашего приложения.

Перед запросом разрешений необходимо указать их в файле манифеста приложения, используя элемент <uses-permission> . Это указание остается неизменным независимо от того, относится ли разрешение к телефону или к функции, специфичной для очков, но для аппаратного обеспечения или функциональности, специфичной для очков, запрос все равно необходимо запрашивать явно.

<manifest ...>
    <!-- Only declare permissions that your app actually needs. In this example,
    we declare permissions for the camera. -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application ...>
        ...
    </application>
</manifest>

Перед тем как запросить разрешение на ношение очков

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

Сценарии разрешений

При запросе опасных разрешений во время выполнения для аудио- и видеоочков могут возникнуть различные ситуации:

  • Запросить разрешения во время выполнения для прогнозируемой активности
  • Запросить разрешения во время выполнения от действия телефона

Подробную информацию о каждом сценарии см. в следующих разделах данного руководства.

Запрашивать и обрабатывать разрешения во время выполнения для прогнозируемой активности.

Для запроса разрешений на использование аудио- и видеоочков сначала используйте ActivityResultLauncher с методом ProjectedPermissionsResultContract для регистрации средства запуска разрешений. После того, как пользователь обработает запрос на разрешение, функция обратного вызова получит карту имен разрешений, соответствующих их статусу предоставления.

// Register the permissions launcher using the ProjectedPermissionsResultContract.
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
    registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
        if (results[Manifest.permission.CAMERA] == true) {
            isPermissionDenied = false
            initializeGlassesFeatures()
        } else {
            // Handle permission denial.
            isPermissionDenied = true
        }
    }

Основные моменты, касающиеся кода.

  • Необходимо указать, какие разрешения требуются вашему приложению, например, Manifest.permission.CAMERA или Manifest.permission.RECORD_AUDIO .
  • Ваше приложение должно корректно обрабатывать как одобренные, так и отклоненные результаты в функции обратного вызова запуска.

Для запуска процесса запроса разрешений передайте список объектов ProjectedPermissionsRequestParams в метод launch вашего зарегистрированного средства запуска разрешений. Объект ProjectedPermissionsRequestParams объединяет запрошенные разрешения из манифеста вместе с пользовательской строкой rationale . Строка rationale должна четко и кратко объяснять, почему приложению требуется доступ к аппаратным функциям очков (таким как камера или микрофон).

private fun requestHardwarePermissions() {
    val params = ProjectedPermissionsRequestParams(
        permissions = listOf(Manifest.permission.CAMERA),
        rationale = "Camera access is required to overlay digital content on your physical environment."
    )
    requestPermissionLauncher.launch(listOf(params))
}

Основные моменты, касающиеся кода.

Разберитесь в пользовательском процессе запроса разрешений.

При отправке запроса на разрешение с использованием метода ProjectedPermissionsResultContract система инициирует скоординированный поток действий пользователя как на очках, так и на телефоне.

В процессе предоставления пользовательских разрешений ваше приложение и пользователь могут ожидать следующего:

  1. На очках : на проецируемом устройстве (очках) появляется сообщение, предлагающее пользователю посмотреть на свой телефон, чтобы продолжить.

  2. На телефоне : Одновременно на основном устройстве (телефоне) запускается действие. На этом экране отображается предоставленная вами строка обоснования, и пользователю предлагается продолжить или отменить действие.

  3. На телефоне : Если пользователь принимает предложенные условия, на телефоне появляется модифицированное диалоговое окно разрешения системы Android, сообщающее пользователю, что разрешение предоставляется очкам (а не телефону), и пользователь может официально предоставить или отклонить разрешение.

  4. Получение результата : После того, как пользователь сделает окончательный выбор, действия на телефоне и очках закрываются. Затем вызывается функция обратного вызова ActivityResultLauncher с картой, содержащей статус предоставления каждого запрошенного разрешения.

Запросить разрешения во время выполнения в рамках действия телефона.

Если ваше приложение работает в режиме телефона, но требует разрешений для аудио- или дисплейных очков — например, чтобы пользователь мог переключить видеопоток на камеру очков для просмотра от первого лица — запросите разрешения, используя метод Activity#requestPermissions(permissions, requestCode, deviceId) специфичный для данного устройства.

Для управления аудио- и дисплейными очками получите соответствующий идентификатор устройства, вызвав getDeviceId в контексте проецируемого устройства. Передайте этот идентификатор при запросе разрешений от вашей активности на телефоне, как показано в следующем примере:

// Request the projected permission from phone activity
requestPermissions(
    arrayOf(Manifest.permission.CAMERA),
    // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant
    REQUEST_CODE_GLASSES_CAMERA,
    projectedDeviceId
)

Обработка результатов проверки разрешений

После того как пользователь ответит на диалоговое окно запроса разрешения на телефоне, его решение будет передано вашему приложению путем вызова функции обратного вызова onRequestPermissionsResult.

Для обработки ответа переопределите onRequestPermissionsResult в экземпляре Activity , инициировавшем запрос на разрешение.

Следующий фрагмент кода показывает, как обработать обратный вызов и проверить, предоставил ли пользователь запрошенные разрешения:

private companion object {
    // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant.
    const val REQUEST_CODE_GLASSES_CAMERA = 1001
}

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray,
    deviceId: Int
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)

    // Handle the result of the permission request
    if (requestCode == REQUEST_CODE_GLASSES_CAMERA && deviceId == projectedDeviceId) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Proceed with glasses camera features
        } else {
            // Handle glasses permission denied
        }
    }
}

Основные моменты, касающиеся кода.
  • Используйте перегрузку deviceId с коллбэком onRequestPermissionsResult , чтобы гарантировать корректное сопоставление статуса разрешения с конкретным контекстом, например, с аудио- или дисплейными очками, а не с телефоном-хостом.
  • Ваше приложение должно корректно обрабатывать как одобренные, так и отклоненные результаты.