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

Поддерживаемые 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>

Перед запросом разрешений для очков

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

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

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

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

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

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

Чтобы запросить динамические разрешения для аудио или дисплея очков из проецируемого действия, используйте метод ProjectedActivityCompat.requestPermissions.

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

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

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

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
private fun requestCameraPermission() {
    lifecycleScope.launch {
        try {
            ProjectedActivityCompat.requestPermissions(
                this@PermissionsFromProjectedActivity,
                arrayOf(Manifest.permission.CAMERA),
                // CAMERA_PERMISSION_REQUEST_CODE is a developer defined constant
                CAMERA_PERMISSION_REQUEST_CODE,
            )
        } catch (e: IllegalStateException) {
            // Thrown when the projected system service can't be bound.
            Log.e(TAG, "Camera permission request failed: projected service unavailable.", e)
        }
    }
}

Ключевые моменты

  • Используйте ProjectedActivityCompat.requestPermissions вместо стандартного метода ActivityCompat. Этот метод позволяет явно задать разрешения для аудио- и видеоочков, а не для хост-телефона.

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

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

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

Чтобы обработать ответ, переопределите onRequestPermissionsResult() в экземпляре Activity, который инициировал запрос разрешения.

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

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

    val isCameraGranted =
        grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) ==
            PackageManager.PERMISSION_GRANTED

    if (isCameraGranted) {
        initializeCameraFeatures()
    } else {
        onCameraPermissionDenied()
    }
}

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

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

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

// 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
)

Ключевые моменты

  • Чтобы настроить таргетинг на аудиоустройства и видеоочки, получите идентификатор нужного устройства из прогнозируемого контекста, созданного с помощью createProjectedDeviceContext. Передайте этот идентификатор в вызове метода requestPermissions.

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

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

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

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

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

    val isCameraGranted =
        grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) ==
            PackageManager.PERMISSION_GRANTED

    if (isCameraGranted) {
        initializeCameraFeatures()
    } else {
        onCameraPermissionDenied()
    }
}

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