ऑडियो ग्लास और डिसप्ले ग्लास के लिए, ऑगमेंटेड एक्सपीरियंस को Android के मौजूदा Activity फ़्रेमवर्क एपीआई पर बनाया गया है. साथ ही, इनमें इन ग्लास की खास बातों को ध्यान में रखते हुए, अतिरिक्त कॉन्सेप्ट शामिल किए गए हैं. एक्सआर हेडसेट, डिवाइस पर पूरा APK चलाते हैं. हालांकि, ऑडियो ग्लास और डिसप्ले ग्लास, एक खास गतिविधि का इस्तेमाल करते हैं. यह गतिविधि, आपके फ़ोन के मौजूदा ऐप्लिकेशन में चलती है. इस गतिविधि को होस्ट डिवाइस से ग्लास पर प्रोजेक्ट किया जाता है.
ऑडियो ग्लास और डिसप्ले ग्लास के लिए अपने ऐप्लिकेशन का अनुभव बनाने के लिए, आपको अपने मौजूदा फ़ोन ऐप्लिकेशन को बढ़ाना होगा. इसके लिए, एक नया प्रोजेक्टेड Activity बनाएं. इस गतिविधि से, चश्मे पर आपके ऐप्लिकेशन को लॉन्च करने का मुख्य एंट्री पॉइंट मिलता है. इस तरीके से, डेवलपमेंट करना आसान हो जाता है. ऐसा इसलिए, क्योंकि फ़ोन और चश्मे के लिए, कारोबार से जुड़े लॉजिक को शेयर और फिर से इस्तेमाल किया जा सकता है.
वर्शन के साथ काम करने की सुविधा
Jetpack XR SDK के लिए, Android SDK के साथ काम करने से जुड़ी ज़रूरी शर्तें देखें.
डिपेंडेंसी
ऑडियो ग्लास और डिसप्ले ग्लास के लिए, लाइब्रेरी की ये डिपेंडेंसी जोड़ें:
शानदार
dependencies {
implementation "androidx.xr.runtime:runtime:1.0.0-alpha14"
implementation "androidx.xr.glimmer:glimmer:1.0.0-alpha12"
implementation "androidx.xr.glimmer:glimmer-google-fonts:1.0.0-alpha12"
implementation "androidx.xr.projected:projected:1.0.0-alpha07"
implementation "androidx.xr.arcore:arcore:1.0.0-alpha13"
}
Kotlin
dependencies {
implementation("androidx.xr.runtime:runtime:1.0.0-alpha14")
implementation("androidx.xr.glimmer:glimmer:1.0.0-alpha12")
implementation("androidx.xr.glimmer:glimmer-google-fonts:1.0.0-alpha12")
implementation("androidx.xr.projected:projected:1.0.0-alpha07")
implementation("androidx.xr.arcore:arcore:1.0.0-alpha13")
}
अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में, अपनी गतिविधि का एलान करें
अन्य गतिविधियों की तरह ही, आपको अपनी गतिविधि को ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में एलान करना होगा, ताकि सिस्टम उसे देख सके और चला सके.
<application>
<activity
android:name="com.example.xr.projected.GlassesMainActivity"
android:exported="true"
android:requiredDisplayCategory="xr_projected"
android:label="Example activity for audio glasses and display glasses">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
</application>
कोड के बारे में अहम बातें
android:requiredDisplayCategoryएट्रिब्यूट के लिएxr_projectedकी वैल्यू तय करता है, ताकि सिस्टम को यह बताया जा सके कि इस गतिविधि के लिए अनुमानित कॉन्टेक्स्ट का इस्तेमाल किया जाना चाहिए. इससे कनेक्ट किए गए डिवाइस के हार्डवेयर को ऐक्सेस किया जा सकता है.
अपनी गतिविधि बनाना
इसके बाद, आपको एक छोटी गतिविधि बनानी होगी. इससे डिसप्ले चालू होने पर, एआई चश्मे पर कुछ दिखाया जा सकेगा.
@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)) } }
कोड के बारे में अहम बातें
- Jetpack Projected लाइब्रेरी से opt-in APIs का इस्तेमाल करने के लिए ऑप्ट-इन करता है.
GlassesMainActivity,ComponentActivityको बढ़ाता है. यह मोबाइल डेवलपमेंट में आपकी उम्मीद के मुताबिक होता है.- सभी चश्मों में डिसप्ले नहीं होता है. इसलिए, यह फ़ंक्शन
ProjectedDeviceControllerका इस्तेमाल करके यह जांच करता है कि डिवाइस में डिसप्ले है या नहीं. onCreateफ़ंक्शन में मौजूदsetContentब्लॉक, ऐक्टिविटी के लिए कंपोज़ेबल यूज़र इंटरफ़ेस (यूआई) ट्री का रूट तय करता है. Jetpack Compose Glimmer का इस्तेमाल करके,HomeScreenकंपोज़ेबल लागू किया जाएगा.- यह ऐक्टिविटी के
onCreateमेथड के दौरान यूज़र इंटरफ़ेस (यूआई) को शुरू करता है. इसके बारे में जानने के लिए, प्रोजेक्ट की गई ऐक्टिविटी की लाइफ़साइकल देखें. - कैमरे से जुड़ी उन सुविधाओं के लिए तैयारी करना जो चश्मे के हार्डवेयर को ऐक्सेस करती हैं. इसके लिए, हार्डवेयर ऐक्सेस करने की अनुमतियों का अनुरोध करना ज़रूरी है. ऐसा करने के लिए, अनुमतियों को लॉन्च करने वाले टूल को रजिस्टर करें,
hasCameraPermissionऔरrequestHardwarePermissionsफ़ंक्शन तय करें, और यह देखें किinitializeGlassesFeaturesको कॉल करने से पहले अनुमतियां दी गई हैं या नहीं.
ऐप्लिकेशन बनाने की सुविधा लागू करना
आपने जो गतिविधि बनाई है वह HomeScreen कंपोज़ेबल फ़ंक्शन को रेफ़र करती है. आपको इसे लागू करना होगा. नीचे दिए गए कोड में, Jetpack Compose Glimmer का इस्तेमाल किया गया है. इससे एक कंपोज़ेबल को तय किया जा सकता है. यह कंपोज़ेबल, स्मार्ट ग्लास के डिसप्ले पर कुछ टेक्स्ट दिखा सकता है:
@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") } } }
कोड के बारे में अहम बातें
- आपने अपनी ऐक्टिविटी में पहले ही यह तय कर लिया था कि
HomeScreenफ़ंक्शन में, कंपोज़ किया जा सकने वाला वह कॉन्टेंट शामिल होगा जो चश्मे की डिसप्ले चालू होने पर उपयोगकर्ता को दिखेगा. - Jetpack Compose Glimmer
Textकॉम्पोनेंट, चश्मे के डिसप्ले पर "Hello, AI Glasses!" टेक्स्ट दिखाता है. - Jetpack Compose Glimmer
Button, प्रोजेक्ट की गई गतिविधि मेंonCloseके ज़रिएfinish()को कॉल करके गतिविधि बंद कर देता है.
देखें कि ऑडियो या डिस्प्ले वाले स्मार्ट ग्लास कनेक्ट किए गए हैं या नहीं
यह पता लगाने के लिए कि किसी उपयोगकर्ता के ऑडियो या डिसप्ले वाले चश्मे, आपकी गतिविधि शुरू करने से पहले उसके फ़ोन से कनेक्ट हैं या नहीं, ProjectedContext.isProjectedDeviceConnected तरीके का इस्तेमाल करें. यह तरीका, Flow<Boolean> दिखाता है. आपका ऐप्लिकेशन, कनेक्शन की स्थिति के बारे में रीयल-टाइम अपडेट पाने के लिए इसे देख सकता है.
अपनी गतिविधि शुरू करना
आपने बुनियादी गतिविधि बना ली है. अब इसे अपने चश्मे पर लॉन्च किया जा सकता है. चश्मे के हार्डवेयर को ऐक्सेस करने के लिए, आपके ऐप्लिकेशन को अपनी गतिविधि शुरू करनी होगी. इसके लिए, उसे कुछ खास विकल्पों का इस्तेमाल करना होगा. इन विकल्पों से सिस्टम को प्रोजेक्ट किए गए कॉन्टेक्स्ट का इस्तेमाल करने के बारे में पता चलता है. इसे यहां दिए गए कोड में दिखाया गया है:
val options = ProjectedContext.createProjectedActivityOptions(context) val intent = Intent(context, GlassesMainActivity::class.java) context.startActivity(intent, options.toBundle())
ProjectedContext में मौजूद createProjectedActivityOptions तरीके से, अनुमानित कॉन्टेक्स्ट में अपनी गतिविधि शुरू करने के लिए ज़रूरी विकल्प जनरेट किए जाते हैं.
context पैरामीटर, फ़ोन या चश्मे के डिवाइस का कॉन्टेक्स्ट हो सकता है.
अगले चरण
ऑडियो ग्लास और डिसप्ले ग्लास के लिए पहली गतिविधि बनाने के बाद, इसकी सुविधाओं को बढ़ाने के अन्य तरीके जानें:
- लिखे गए शब्दों को सुनने की सुविधा का इस्तेमाल करके ऑडियो आउटपुट को मैनेज करना
- अपने-आप बोली पहचानने की सुविधा का इस्तेमाल करके ऑडियो इनपुट को मैनेज करना
- Jetpack Compose Glimmer की मदद से यूज़र इंटरफ़ेस (यूआई) बनाना
- ऑडियो ग्लास और डिसप्ले ग्लास पर हार्डवेयर ऐक्सेस करना