Pengalaman kacamata AI dibangun di atas Activityframework
API Android yang ada dan mencakup konsep tambahan untuk mendukung aspek unik kacamata AI. Tidak seperti headset XR yang menjalankan APK lengkap di perangkat, kacamata AI menggunakan aktivitas khusus yang berjalan dalam aplikasi yang ada di ponsel Anda. Aktivitas ini diproyeksikan dari perangkat host ke kacamata AI.
Untuk membuat pengalaman kacamata AI aplikasi Anda, perluas aplikasi ponsel yang ada
dengan membuat Activity baru yang diproyeksikan untuk kacamata AI. Aktivitas ini berfungsi
sebagai titik entri peluncuran utama untuk aplikasi Anda di kacamata AI. Pendekatan ini
menyederhanakan pengembangan karena Anda dapat membagikan dan menggunakan kembali logika bisnis antara
pengalaman kacamata AI dan ponsel Anda.
Kompatibilitas versi
Periksa persyaratan kompatibilitas Android SDK untuk Jetpack XR SDK.
Dependensi
Tambahkan dependensi library berikut untuk kacamata AI:
Groovy
dependencies { implementation "androidx.xr.runtime:runtime:1.0.0-alpha11" 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-alpha11") 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") }
Mendeklarasikan aktivitas Anda dalam manifes aplikasi
Sama seperti jenis aktivitas lainnya, Anda perlu mendeklarasikan aktivitas dalam file manifes aplikasi agar sistem dapat melihat dan menjalankannya.
<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>
Poin penting tentang kode
- Menentukan
xr_projecteduntuk atributandroid:requiredDisplayCategoryuntuk memberi tahu sistem bahwa aktivitas ini harus menggunakan konteks yang diproyeksikan untuk mengakses hardware dari perangkat yang terhubung.
Buat aktivitas Anda
Selanjutnya, Anda akan membuat aktivitas kecil yang dapat menampilkan sesuatu di kacamata AI setiap kali layar diaktifkan.
@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)) } }
Poin penting tentang kode
- Memilih untuk menggunakan API keikutsertaan dari library Jetpack Projected.
GlassesMainActivitymemperluasComponentActivity, seperti yang Anda harapkan dalam pengembangan aplikasi untuk platform seluler.- Karena tidak semua kacamata AI memiliki layar, periksa apakah perangkat memiliki
layar menggunakan
ProjectedDeviceController. - Blok
setContentdalam fungsionCreatemenentukan root hierarki UI Composable untuk aktivitas. Anda akan menerapkan composableHomeScreenmenggunakan Jetpack Compose Glimmer. - Menginisialisasi UI selama metode
onCreateaktivitas (lihat siklus proses aktivitas yang diproyeksikan). - Untuk menyiapkan fitur terkait kamera yang
mengakses hardware kacamata, minta izin hardware dengan
mendaftarkan peluncur izin, menentukan fungsi
hasCameraPermissiondanrequestHardwarePermissions, serta memeriksa apakah izin telah diberikan sebelum memanggilinitializeGlassesFeatures.
Mengimplementasikan composable
Aktivitas yang Anda buat mereferensikan fungsi composable HomeScreen yang
perlu Anda terapkan. Kode berikut menggunakan Jetpack Compose Glimmer untuk
menentukan composable yang dapat menampilkan beberapa teks di layar kacamata AI:
@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") } } }
Poin penting tentang kode
- Seperti yang Anda tentukan dalam aktivitas sebelumnya, fungsi
HomeScreenmencakup konten composable yang dilihat pengguna saat layar kacamata AI aktif. - Komponen Glimmer
TextJetpack Compose menampilkan teks "Hello, Kacamata AI!" ke layar kacamata. - Glimmer
ButtonJetpack Compose menutup aktivitas dengan memanggilfinish()melaluionClosedalam aktivitas kacamata AI.
Memeriksa apakah kacamata AI terhubung
Untuk menentukan apakah kacamata AI pengguna terhubung ke ponselnya sebelum
meluncurkan aktivitas Anda, gunakan metode
ProjectedContext.isProjectedDeviceConnected. Metode ini
menampilkan Flow<Boolean> yang dapat diamati aplikasi Anda untuk mendapatkan update real-time tentang
status koneksi.
Mulai aktivitas Anda
Setelah membuat aktivitas dasar, Anda dapat meluncurkannya ke kacamata Anda. Untuk mengakses hardware kacamata, aplikasi Anda harus memulai aktivitas dengan opsi tertentu yang memberi tahu sistem untuk menggunakan konteks yang diproyeksikan, seperti yang ditunjukkan dalam kode berikut:
val options = ProjectedContext.createProjectedActivityOptions(context) val intent = Intent(context, GlassesMainActivity::class.java) context.startActivity(intent, options.toBundle())
Metode createProjectedActivityOptions di ProjectedContext
membuat opsi yang diperlukan untuk memulai aktivitas Anda dalam konteks yang diproyeksikan.
Parameter context dapat berupa konteks dari ponsel atau perangkat kacamata.
Langkah berikutnya
Setelah membuat aktivitas pertama untuk kacamata AI, pelajari cara lain untuk memperluas fungsinya:
- Menangani output audio menggunakan Text to Speech
- Menangani input audio menggunakan Pengenalan Ucapan Otomatis
- Membangun UI dengan Jetpack Compose Glimmer
- Mengakses hardware kacamata AI