A experiência dos óculos com IA é criada na API do framework Activity do Android e inclui outros conceitos para oferecer suporte aos aspectos exclusivos dos óculos com IA. Ao contrário dos headsets XR que executam um APK completo no dispositivo, os óculos com IA usam uma atividade dedicada que é executada no app do smartphone. Essa atividade é projetada do dispositivo host para os óculos com IA.
Para criar a experiência de óculos com IA do seu app, estenda o aplicativo para telefones criando uma nova Activity projetada para óculos com IA. Essa atividade serve como o principal ponto de entrada de inicialização do seu app em óculos com IA. Essa abordagem simplifica o desenvolvimento porque você pode compartilhar e reutilizar a lógica de negócios entre as experiências de smartphone e óculos com IA.
Compatibilidade de versões
Confira os requisitos de compatibilidade do SDK do Android para o SDK do Jetpack XR.
Dependências
Adicione as seguintes dependências de biblioteca para óculos com 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") }
Declarar sua atividade no manifesto do app
Assim como outros tipos de atividades, é necessário declarar sua atividade no arquivo de manifesto do app para que o sistema a veja e a execute.
<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>
Principais pontos sobre o código
- Especifica
xr_projectedpara o atributoandroid:requiredDisplayCategorypara informar ao sistema que essa atividade precisa usar um contexto projetado para acessar o hardware de um dispositivo conectado.
Criar sua atividade
Em seguida, você vai criar uma pequena atividade que pode mostrar algo nos óculos com IA sempre que a tela estiver ativada.
@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)) } }
Principais pontos sobre o código
- Aceita o uso de APIs de aceitação da biblioteca projetada do Jetpack.
GlassesMainActivityestendeComponentActivity, como esperado no desenvolvimento para dispositivos móveis.- Como nem todos os óculos com IA têm uma tela, verifica se o dispositivo tem uma
tela usando
ProjectedDeviceController. - O bloco
setContentna funçãoonCreatedefine a raiz da árvore de interface combinável para a atividade. Você vai implementar oHomeScreenelemento combinável usando o Jetpack Compose Glimmer. - Inicializa a interface durante o método
onCreateda atividade (consulte o ciclo de vida da atividade projetada). - Para se preparar para recursos relacionados à câmera que
acessam o hardware dos óculos, solicita permissões de hardware ao
registrar um iniciador de permissões, definindo as funções
hasCameraPermissionerequestHardwarePermissionse verificando se as permissões foram concedidas antes de chamarinitializeGlassesFeatures.
Implementar o elemento combinável
A atividade criada faz referência a uma função combinável HomeScreen que você precisa implementar. O código a seguir usa Jetpack Compose Glimmer para
definir um elemento combinável que pode mostrar algum texto na tela dos óculos com 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") } } }
Principais pontos sobre o código
- Como você definiu na atividade anterior, a função
HomeScreeninclui o conteúdo combinável que o usuário vê quando a tela dos óculos com IA está ativada. - O componente
Textdo Jetpack Compose Glimmer mostra o texto "Hello, AI Glasses!" na tela dos óculos. - O
Buttondo Jetpack Compose Glimmer fecha a atividade chamandofinish()poronClosena atividade dos óculos com IA.
Verificar se os óculos com IA estão conectados
Para determinar se os óculos com IA de um usuário estão conectados ao smartphone antes de
iniciar a atividade, use o
ProjectedContext.isProjectedDeviceConnected método. Esse método
retorna um Flow<Boolean> que seu app pode observar para receber atualizações em tempo real sobre
o status da conexão.
Iniciar sua atividade
Agora que você criou uma atividade básica, é possível iniciá-la nos óculos. Para acessar o hardware dos óculos, seu app precisa iniciar a atividade com opções específicas que informam ao sistema para usar um contexto projetado, conforme mostrado no código a seguir:
val options = ProjectedContext.createProjectedActivityOptions(context) val intent = Intent(context, GlassesMainActivity::class.java) context.startActivity(intent, options.toBundle())
O método createProjectedActivityOptions em ProjectedContext
gera as opções necessárias para iniciar sua atividade em um contexto projetado.
O parâmetro context pode ser um contexto do smartphone ou do dispositivo dos óculos.
Próximas etapas
Agora que você criou sua primeira atividade para óculos com IA, conheça outras maneiras de estender a funcionalidade dela:
- Processar saída de áudio usando a conversão de texto em voz
- Processar entrada de áudio usando o reconhecimento de voz automático
- Criar interface com o Jetpack Compose Glimmer
- Acessar o hardware dos óculos com IA