Как и в случае с телефоном, для доступа к конфиденциальному оборудованию, например камере и микрофону, в аудио- и видеоочках требуется явное согласие пользователя. Это разрешения, относящиеся к очкам, и ваше приложение должно запрашивать их во время выполнения, даже если у него уже есть соответствующие разрешения на телефоне.
Укажите разрешения в манифесте приложения
Прежде чем запрашивать разрешения, вы должны указать их в файле манифеста приложения с помощью элемента <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)) }
Ключевые моменты
- При вызове метода
launchв программе запуска запускается поток запроса разрешения у пользователя.
Как выглядит запрос разрешения для пользователя
Когда вы запускаете запрос разрешения с помощью метода ProjectedPermissionsResultContract, система инициирует скоординированный процесс для очков и телефона.
Вот что происходит, когда пользователь предоставляет разрешения:
На очках. На проектируемом устройстве (очках) появляется сообщение с инструкцией посмотреть на телефон.
На телефоне. Одновременно с этим на основном устройстве (телефоне) запускается сеанс. На этом экране показывается строка обоснования, которую вы указали, и пользователю предлагается продолжить или отменить действие.
На телефоне. Если пользователь примет обоснование, на телефоне появится измененное диалоговое окно системного разрешения Android, в котором будет указано, что разрешение предоставляется для очков (а не для телефона), и пользователь сможет официально предоставить или отклонить разрешение.
Получение результата. После того как пользователь сделает выбор, все действия на телефоне и в очках будут закрыты. Затем вызывается обратный вызов
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, чтобы статус разрешения правильно сопоставлялся с определенным контекстом, например с аудио или дисплеем, а не с хост-телефоном. - Приложение должно корректно обрабатывать как предоставленные, так и отклоненные разрешения.