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

Применимые устройства XR
Это руководство поможет вам создать опыт использования этих типов XR-устройств.
Очки ИИ

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

Следуйте этому руководству, чтобы:

  • Объявите разрешения в манифесте вашего приложения
  • Запросить разрешения
  • Узнайте о потоке разрешений пользователя

Объявите разрешения в манифесте вашего приложения

Прежде чем запрашивать разрешения, необходимо объявить их в файле манифеста приложения с помощью элемента <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() система инициирует скоординированный поток действий пользователя как через очки ИИ, так и через телефон.

Вот чего может ожидать ваше приложение и пользователь в процессе предоставления разрешений:

  1. На очках ИИ : на проецируемом устройстве (очках) появляется действие, предлагающее пользователю посмотреть на свой телефон, чтобы продолжить.

  2. На телефоне : Одновременно на главном устройстве (телефоне) запускается действие. На этом экране отображается предоставленная вами строка обоснования, и пользователю предоставляется возможность продолжить или отменить действие.

  3. На телефоне : если пользователь принимает обоснование, на телефоне появляется измененное диалоговое окно разрешения системы Android, сообщающее пользователю, что он предоставляет разрешение для устройства очков ИИ (не телефона), и пользователь может официально предоставить или отклонить разрешение.

  4. Получение результата : после того, как пользователь сделает окончательный выбор, действия на телефоне и очках с искусственным интеллектом закрываются. Затем вызывается обратный вызов ActivityResultLauncher с картой, содержащей статус выдачи для каждого запрошенного разрешения.