Как и на телефоне, для доступа к конфиденциальному оборудованию, например камере, на аудио- и видеоочках требуется явное согласие пользователя. Это разрешения, относящиеся к очкам, и ваше приложение должно запрашивать их во время выполнения, даже если у него уже есть соответствующие разрешения на телефоне.
Объявите разрешения в манифесте приложения
Прежде чем запрашивать разрешения, объявите их в манифесте приложения с помощью элемента <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.
Вызов этого метода запускает скоординированный пользовательский поток как на очках, так и на телефоне.
- На очках. Система открывает на очках сопутствующее действие, предлагая пользователю ответить на запрос разрешения на телефоне.
- На телефоне. На экране телефона появится диалоговое окно с запросом разрешения. В диалоговом окне явно указано, что пользователь предоставляет разрешение для очков, а не для телефона. Пользователь может одобрить или отклонить запрос.
В примере ниже показано, как запросить разрешения для очков из проецируемого действия.
@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, чтобы статус разрешения был правильно сопоставлен с определенным контекстом, например с аудиоустройством или видеоочками, а не с телефоном. - Приложение должно корректно обрабатывать как предоставление, так и отклонение разрешений.