Cómo solicitar permisos de hardware para los lentes con IA

Dispositivos XR aplicables
Esta guía te ayuda a crear experiencias para estos tipos de dispositivos de XR.
Lentes con IA

Al igual que en un teléfono, acceder a hardware sensible, como la cámara y el micrófono, en los lentes con IA requiere el consentimiento explícito del usuario. Estos se consideran permisos específicos para anteojos, y tu app debe solicitarlos en el tiempo de ejecución, incluso si ya tiene los permisos correspondientes en el teléfono.

Sigue esta guía para hacer lo siguiente:

  • Cómo declarar permisos en el manifiesto de tu app
  • Solicita permisos
  • Obtén información sobre el flujo de permisos del usuario

Declara los permisos en el manifiesto de tu app

Antes de solicitar permisos, debes declararlos en el archivo de manifiesto de tu app con el elemento <uses-permission>. Esta declaración sigue siendo la misma, ya sea que el permiso sea para una función específica de un teléfono o de lentes con IA, pero debes solicitarlo de forma explícita para el hardware o la funcionalidad específicos de los lentes.

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

Solicita permisos

Para solicitar permisos para los lentes con IA, usa ActivityResultLauncher con el método ProjectedPermissionsResultContract(). Debes especificar qué permisos requiere tu app, como Manifest.permission.CAMERA o Manifest.permission.RECORD_AUDIO. Proporciona una explicación clara y concisa que indique por qué tu app necesita estos permisos. Esta explicación se muestra al usuario para ayudarlo a tomar una decisión fundamentada.

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()
    }
}

Puntos clave sobre el código

Comprende el flujo de usuarios de la solicitud de permiso

Cuando inicias una solicitud de permiso con el método ProjectedPermissionsResultContract(), el sistema inicia un flujo de usuario coordinado en los lentes con IA y el teléfono.

Durante el flujo de usuarios de permisos, esto es lo que pueden esperar tu app y el usuario:

  1. En los lentes con IA: Aparece una actividad en el dispositivo proyectado (lentes), que le indica al usuario que mire su teléfono para continuar.

  2. En el teléfono: De forma simultánea, se inicia una actividad en el dispositivo host (teléfono). En esta pantalla, se muestra la cadena de justificación que proporcionaste y se le da al usuario la opción de continuar o cancelar.

  3. En el teléfono: Si el usuario acepta la explicación, aparecerá en el teléfono un diálogo de permiso del sistema Android modificado que le indicará que está otorgando el permiso para el dispositivo de anteojos con IA (no para el teléfono), y el usuario podrá otorgar o rechazar formalmente el permiso.

  4. Recepción del resultado: Después de que el usuario toma su decisión final, se descartan las actividades tanto en el teléfono como en los lentes con IA. Luego, se invoca tu devolución de llamada ActivityResultLauncher con un mapa que contiene el estado otorgado para cada permiso solicitado.