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
- Creamos un
ActivityResultLaunchercon el métodoProjectedPermissionsResultContract(). La devolución de llamada recibe un mapa de los nombres de los permisos y su estado de concesión. - La función
requestAudioPermission()compila un objetoProjectedPermissionsRequestParams. Este objeto agrupa la lista de permisos que necesitamos y la justificación para el usuario. - Llamar a
launch()en el selector inicia el flujo de usuarios de solicitud de permisos. - Tu app debe controlar los resultados otorgados y rechazados con facilidad en la devolución de llamada del selector.
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:
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.
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.
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.
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
ActivityResultLaunchercon un mapa que contiene el estado otorgado para cada permiso solicitado.