La experiencia de los lentes de IA se basa en la API del framework Activity de Android existente y incluye conceptos adicionales para admitir los aspectos únicos de
los lentes de IA. A diferencia de los visores de realidad extendida que ejecutan un APK completo en el dispositivo, los lentes de IA usan una actividad dedicada que se ejecuta dentro de la app existente de tu teléfono. Esta actividad se proyecta desde el dispositivo host a los lentes de IA.
Para crear la experiencia de los lentes de IA de tu app, extiende la app existente para teléfonos
creando una nueva proyectada Activity para los lentes de IA. Esta actividad sirve como el punto de entrada de inicio principal para tu app en los lentes de IA. Este enfoque simplifica el desarrollo porque puedes compartir y reutilizar la lógica empresarial entre las experiencias de tu teléfono y los lentes de IA.
Compatibilidad de versiones
Consulta los requisitos de compatibilidad del SDK de Android para el SDK de XR de Jetpack.
Dependencias
Agrega las siguientes dependencias de biblioteca para los lentes de IA:
Groovy
dependencies { implementation "androidx.xr.runtime:runtime:1.0.0-alpha12" implementation "androidx.xr.glimmer:glimmer:1.0.0-alpha08" implementation "androidx.xr.projected:projected:1.0.0-alpha05" implementation "androidx.xr.arcore:arcore:1.0.0-alpha11" }
Kotlin
dependencies { implementation("androidx.xr.runtime:runtime:1.0.0-alpha12") implementation("androidx.xr.glimmer:glimmer:1.0.0-alpha08") implementation("androidx.xr.projected:projected:1.0.0-alpha05") implementation("androidx.xr.arcore:arcore:1.0.0-alpha11") }
Declara tu actividad en el manifiesto de tu app
Al igual que con otros tipos de actividades, debes declarar tu actividad en el archivo de manifiesto de tu app para que el sistema la vea y la ejecute.
<application>
<activity
android:name="com.example.xr.projected.GlassesMainActivity"
android:exported="true"
android:requiredDisplayCategory="xr_projected"
android:label="Example AI Glasses activity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
</application>
Puntos clave sobre el código
- Especifica
xr_projectedpara el atributoandroid:requiredDisplayCategorypara indicarle al sistema que esta actividad debe usar un contexto proyectado para acceder al hardware desde un dispositivo conectado.
Crea tu actividad
A continuación, crearás una pequeña actividad que pueda mostrar algo en los lentes de IA cada vez que se encienda la pantalla.
@OptIn(ExperimentalProjectedApi::class) class GlassesMainActivity : ComponentActivity() { private var displayController: ProjectedDisplayController? = null private var isVisualUiSupported by mutableStateOf(false) private var areVisualsOn by mutableStateOf(true) private var isPermissionDenied by mutableStateOf(false) // Register the permissions launcher using the ProjectedPermissionsResultContract. private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> = registerForActivityResult(ProjectedPermissionsResultContract()) { results -> if (results[Manifest.permission.CAMERA] == true) { isPermissionDenied = false initializeGlassesFeatures() } else { // Handle permission denial. isPermissionDenied = true } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onDestroy(owner: LifecycleOwner) { displayController?.close() displayController = null } }) if (hasCameraPermission()) { initializeGlassesFeatures() } else { requestHardwarePermissions() } setContent { GlimmerTheme { HomeScreen( areVisualsOn = areVisualsOn, isVisualUiSupported = isVisualUiSupported, isPermissionDenied = isPermissionDenied, onRetryPermission = { requestHardwarePermissions() }, onClose = { finish() } ) } } } private fun initializeGlassesFeatures() { lifecycleScope.launch { // Check device capabilities val projectedDeviceController = ProjectedDeviceController.create(this@GlassesMainActivity) isVisualUiSupported = projectedDeviceController.capabilities.contains(CAPABILITY_VISUAL_UI) val controller = ProjectedDisplayController.create(this@GlassesMainActivity) displayController = controller val observer = GlassesLifecycleObserver( context = this@GlassesMainActivity, controller = controller, onVisualsChanged = { visualsOn -> areVisualsOn = visualsOn } ) lifecycle.addObserver(observer) } } private fun hasCameraPermission(): Boolean { return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED } private fun requestHardwarePermissions() { val params = ProjectedPermissionsRequestParams( permissions = listOf(Manifest.permission.CAMERA), rationale = "Camera access is required to overlay digital content on your physical environment." ) requestPermissionLauncher.launch(listOf(params)) } }
Puntos clave sobre el código
- Habilita el uso de las APIs de participación de la biblioteca de Jetpack Projected.
GlassesMainActivityextiendeComponentActivity, tal como lo esperarías en el desarrollo para dispositivos móviles.- Como no todos los lentes de IA tienen una pantalla, verifica si el dispositivo tiene una
pantalla con
ProjectedDeviceController. - El bloque
setContentdentro de la funciónonCreatedefine la raíz del árbol de la IU componible para la actividad. Implementarás el elementoHomeScreencomponible con Jetpack Compose Glimmer. - Inicializa la IU durante el método
onCreatede la actividad (consulta el ciclo de vida de la actividad proyectada). - Para prepararse para las funciones relacionadas con la cámara que
acceden al hardware de los lentes, solicita permisos de hardware al
registrar un selector de permisos, definir las funciones
hasCameraPermissionyrequestHardwarePermissions, y verificar si se otorgaron permisos antes de llamar ainitializeGlassesFeatures.
Implementa el elemento componible
La actividad que creaste hace referencia a una función componible HomeScreen que debes implementar. El siguiente código usa Jetpack Compose Glimmer para
definir un elemento componible que puede mostrar texto en la pantalla de los lentes de IA:
@Composable fun HomeScreen( areVisualsOn: Boolean, isVisualUiSupported: Boolean, isPermissionDenied: Boolean, onRetryPermission: () -> Unit, onClose: () -> Unit, modifier: Modifier = Modifier ) { Box( modifier = modifier .surface(focusable = false) .fillMaxSize(), contentAlignment = Alignment.Center ) { if (isPermissionDenied) { Card( title = { Text("Permission Required") }, action = { Button(onClick = onClose) { Text("Exit") } } ) { Text("Camera access is needed to use AI glasses features.") Button(onClick = onRetryPermission) { Text("Retry") } } } else if (isVisualUiSupported) { Card( title = { Text("Android XR") }, action = { Button(onClick = onClose) { Text("Close") } } ) { if (areVisualsOn) { Text("Hello, AI Glasses!") } else { Text("Display is off. Audio guidance active.") } } } else { Text("Audio Guidance Mode Active") } } }
Puntos clave sobre el código
- Como definiste en tu actividad anteriormente, la función
HomeScreenincluye el contenido componible que el usuario ve cuando la pantalla de los lentes de IA está encendida. - El componente
Textde Jetpack Compose Glimmer muestra el texto "Hello, AI Glasses!" en la pantalla de los lentes. - El componente
Buttonde Jetpack Compose Glimmer cierra la actividad llamando afinish()a través deonCloseen la actividad de los lentes de IA.
Verifica si los lentes de IA están conectados
Para determinar si los lentes de IA de un usuario están conectados a su teléfono antes de
iniciar tu actividad, usa el
ProjectedContext.isProjectedDeviceConnected método. Este método
muestra un Flow<Boolean> que tu app puede observar para obtener actualizaciones en tiempo real sobre
el estado de la conexión.
Inicia tu actividad
Ahora que creaste una actividad básica, puedes iniciarla en tus lentes. Para acceder al hardware de los lentes, tu app debe iniciar tu actividad con opciones específicas que le indiquen al sistema que use un contexto proyectado, como se muestra en el siguiente código:
val options = ProjectedContext.createProjectedActivityOptions(context) val intent = Intent(context, GlassesMainActivity::class.java) context.startActivity(intent, options.toBundle())
El método createProjectedActivityOptions en ProjectedContext
genera las opciones necesarias para iniciar tu actividad en un contexto proyectado.
El parámetro context puede ser un contexto del teléfono o del dispositivo de los lentes.
Próximos pasos
Ahora que creaste tu primera actividad para los lentes de IA, explora otras formas de extender su funcionalidad:
- Cómo controlar la salida de audio con Text-to-Speech
- Cómo controlar la entrada de audio con el Reconocimiento automático de voz
- Cómo compilar la IU con Jetpack Compose Glimmer
- Cómo acceder al hardware de los lentes de IA