Как запросить разрешения на использование оборудования для аудиоочков и очков с дисплеем

Поддерживаемые 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 в контексте проецируемого устройства. Передайте этот идентификатор при запросе разрешений из объекта activity телефона, как показано в следующем примере:

// 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, чтобы статус разрешения правильно сопоставлялся с определенным контекстом, например с аудио или дисплеем, а не с хост-телефоном.
  • Приложение должно корректно обрабатывать как предоставленные, так и отклоненные разрешения.