Как и на телефоне, доступ к чувствительному оборудованию, такому как камера и микрофон, в очках с искусственным интеллектом требует явного согласия пользователя. Эти разрешения считаются специфическими для очков , и ваше приложение должно запрашивать их во время выполнения, даже если у него уже есть соответствующие разрешения на телефоне.
Следуйте этому руководству, чтобы:
- Объявите разрешения в манифесте вашего приложения
- Запросить разрешения
- Узнайте о потоке разрешений пользователя
Объявите разрешения в манифесте вашего приложения
Прежде чем запрашивать разрешения, необходимо объявить их в файле манифеста приложения с помощью элемента <uses-permission> . Это объявление остаётся неизменным независимо от того, предназначено ли разрешение для телефона или функции, специфичной для очков с искусственным интеллектом, но для аппаратного обеспечения или функциональности, специфичных для очков, его всё равно необходимо явно запросить.
<manifest ...>
<!-- Only declare permissions that your app actually needs. In this example,
we declare permissions for the microphone. -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<application ...>
...
</application>
</manifest>
Запросить разрешения
Чтобы запросить разрешения для очков с искусственным интеллектом, используйте ActivityResultLauncher с методом ProjectedPermissionsResultContract() . Вам необходимо указать, какие разрешения требуются вашему приложению, например Manifest.permission.CAMERA или Manifest.permission.RECORD_AUDIO . Предоставьте четкое и краткое обоснование, почему вашему приложению нужны эти разрешения. Это обоснование отображается пользователю, чтобы помочь ему принять обоснованное решение.
class SampleGlassesActivity : ComponentActivity() {
// Register the permissions launcher
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
// Check the result for the specific RECORD_AUDIO permission
if (results[Manifest.permission.RECORD_AUDIO] == true) {
onPermissionGranted()
} else {
onPermissionDenied()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Audio permission is critical for the displayless AI glasses experience
checkAndRequestAudioPermission()
setContent {
GlimmerTheme {
DisplayGlassesUi()
}
}
}
// Checks for the required RECORD_AUDIO permission and requests it if necessary.
private fun checkAndRequestAudioPermission() {
val permission = Manifest.permission.RECORD_AUDIO
val permissionStatus = ContextCompat.checkSelfPermission(this, permission)
if (permissionStatus == PackageManager.PERMISSION_GRANTED) {
// Permission is already granted
onPermissionGranted()
} else {
// Permission is not granted, request it
requestAudioPermission()
}
}
private fun requestAudioPermission() {
val params = ProjectedPermissionsRequestParams(
permissions = listOf(Manifest.permission.RECORD_AUDIO),
// The rationale should explain why this permission is needed.
// For displayless AI glasses, it's often the main input mechanism.
rationale = "Microphone access is essential for voice commands and features on these AI glasses."
)
requestPermissionLauncher.launch(listOf(params))
}
private fun onPermissionGranted() {
// Implement the logic for when the permission is granted
}
private fun onPermissionDenied() {
// Implement the logic for when the permission is denied.
// On displayless AI glasses, if the app requires voice/mic it should exit the activity if the critical permission is denied.
finish()
}
}
Ключевые моменты кода
- Мы создаём
ActivityResultLauncherс помощью методаProjectedPermissionsResultContract(). Обратный вызов получает сопоставление имён разрешений с их статусом предоставления. - Функция
requestAudioPermission()создаёт объектProjectedPermissionsRequestParams. Этот объект содержит список необходимых нам разрешений и обоснование для пользователя. - Вызов
launch()на лаунчере запускает поток запроса разрешения пользователем . - Ваше приложение должно корректно обрабатывать как разрешенные, так и отклоненные результаты в обратном вызове загрузчика.
Понять процесс запроса разрешения пользователем
При запуске запроса на разрешение с использованием метода ProjectedPermissionsResultContract() система инициирует скоординированный поток действий пользователя как через очки ИИ, так и через телефон.
Если в вашем приложении уже есть Activity отображаемое на телефоне, вам следует использовать Activity#requestPermissions(permissions, requestCode, deviceId) , где deviceId берется из вызова метода getDeviceId() в Context , возвращаемом вызовом ProjectedContext.createProjectedDeviceContext() .
Вот чего может ожидать ваше приложение и пользователь в процессе предоставления разрешений:
На очках ИИ : на проецируемом устройстве (очках) появляется действие, предлагающее пользователю посмотреть на свой телефон, чтобы продолжить.
tts?.speak("Please review the permission request on your host device", TextToSpeech.QUEUE_ADD, null, "permission_request")На телефоне : Одновременно на главном устройстве (телефоне) запускается действие. На этом экране отображается предоставленная вами строка обоснования, и пользователю предоставляется возможность продолжить или отменить действие.
На телефоне : если пользователь принимает обоснование, на телефоне появляется измененное диалоговое окно разрешения системы Android, сообщающее пользователю, что он предоставляет разрешение для устройства очков ИИ (не телефона), и пользователь может официально предоставить или отклонить разрешение.
Получение результата : после того, как пользователь сделает окончательный выбор, действия на телефоне и очках с искусственным интеллектом закрываются. Затем вызывается обратный вызов
ActivityResultLauncherс картой, содержащей статус выдачи для каждого запрошенного разрешения.