ऑडियो ग्लास और डिसप्ले ग्लास पर हार्डवेयर ऐक्सेस करने के लिए, प्रोजेक्ट किए गए कॉन्टेक्स्ट का इस्तेमाल करना

XR डिवाइसों के लिए ज़रूरी शर्तें
इस गाइड से, आपको इन XR डिवाइसों के लिए अनुभव बनाने में मदद मिलती है.
ऑडियो और
डिसप्ले वाले चश्मे

ज़रूरी अनुमतियों का अनुरोध करने और उन्हें पाने के बाद, आपका ऐप्लिकेशन ऑडियो वाले चश्मे या डिसप्ले वाले चश्मे के हार्डवेयर को ऐक्सेस कर सकता है. चश्मे के हार्डवेयर को ऐक्सेस करने के लिए (फ़ोन के हार्डवेयर के बजाय), प्रोजेक्टेड कॉन्टेक्स्ट का इस्तेमाल करना ज़रूरी है.

प्रोजेक्टेड कॉन्टेक्स्ट पाने के दो मुख्य तरीके हैं. यह इस बात पर निर्भर करता है कि आपका कोड कहां चल रहा है:

अगर आपका कोड, प्रोजेक्टेड ऐक्टिविटी में चल रहा है, तो प्रोजेक्टेड कॉन्टेक्स्ट पाएं

अगर आपके ऐप्लिकेशन का कोड, आपकी प्रोजेक्टेड ऐक्टिविटी से चल रहा है, तो उसकी अपनी ऐक्टिविटी का कॉन्टेक्स्ट पहले से ही प्रोजेक्टेड कॉन्टेक्स्ट होता है. इस स्थिति में, उस ऐक्टिविटी में किए गए कॉल, चश्मे के हार्डवेयर को पहले से ही ऐक्सेस कर सकते हैं.

फ़ोन ऐप्लिकेशन के कॉम्पोनेंट में चल रहे कोड के लिए, प्रोजेक्टेड कॉन्टेक्स्ट पाएं

अगर आपके ऐप्लिकेशन का कोई हिस्सा, प्रोजेक्टेड ऐक्टिविटी के बाहर (जैसे, फ़ोन की ऐक्टिविटी या कोई सेवा) चश्मे के हार्डवेयर को ऐक्सेस करना चाहता है, तो उसे साफ़ तौर पर प्रोजेक्टेड कॉन्टेक्स्ट पाना होगा. इसके लिए, createProjectedDeviceContext तरीके का इस्तेमाल करें:

@RequiresApi(Build.VERSION_CODES.BAKLAVA)
@OptIn(ExperimentalProjectedApi::class, ExperimentalCoroutinesApi::class)
private fun monitorProjectedConnectivity(activity: ComponentActivity) {
    activity.lifecycleScope.launch {
        // Before creating a projected context, check to see if the projected device is connected.
        // While this method returns true, the projected context remains valid.
        ProjectedContext.isProjectedDeviceConnected(activity, coroutineContext)
            .collectLatest { isConnected ->
                if (isConnected) {
                    // From a phone Activity or Service, get a context for the audio and display glasses.
                    // Re-initialize on reconnect: Obtain another context instance.
                    val projectedContext = try {
                        ProjectedContext.createProjectedDeviceContext(activity)
                    } catch (e: IllegalStateException) {
                        Log.e(TAG, "Failed to create projected context", e)
                        return@collectLatest
                    }

                    // Use the projectedContext to initialize system services (e.g., CameraManager).
                    Log.i(TAG, "Projected device connected. Initializing hardware...")
                } else {
                    // The projected context is destroyed when the device disconnects.
                    // Clean up on disconnect: Listen for 'false' and release resources.
                    Log.i(TAG, "Projected device disconnected. Cleaning up hardware resources...")
                }
            }
    }
}

मान्य है या नहीं, इसकी जांच करें

createProjectedDeviceContext कॉल को ProjectedContext.isProjectedDeviceConnected में रैप करें. जब तक यह तरीका true दिखाता है, तब तक प्रोजेक्टेड कॉन्टेक्स्ट, कनेक्ट किए गए डिवाइस के लिए मान्य रहता है. साथ ही, आपके फ़ोन ऐप्लिकेशन की ऐक्टिविटी या सेवा (जैसे, CameraManager), एआई वाले चश्मे के हार्डवेयर को ऐक्सेस कर सकती है.

डिसकनेक्ट होने पर, साफ़ करें

प्रोजेक्टेड कॉन्टेक्स्ट, कनेक्ट किए गए डिवाइस की लाइफ़साइकल से जुड़ा होता है. इसलिए, डिवाइस के डिसकनेक्ट होने पर यह खत्म हो जाता है. डिवाइस के डिसकनेक्ट होने पर, ProjectedContext.isProjectedDeviceConnected दिखाता है false. आपके ऐप्लिकेशन को इस बदलाव के लिए सुनना चाहिए. साथ ही, आपके ऐप्लिकेशन ने उस प्रोजेक्टेड कॉन्टेक्स्ट का इस्तेमाल करके जो भी सिस्टम सेवाएं (जैसे, CameraManager) या संसाधन बनाए हैं उन्हें साफ़ करना चाहिए.

दोबारा कनेक्ट करने पर, फिर से शुरू करें

चश्मे के दोबारा कनेक्ट होने पर, आपका ऐप्लिकेशन प्रोजेक्टेड कॉन्टेक्स्ट का दूसरा इंस्टेंस createProjectedDeviceContext का इस्तेमाल करके पा सकता है. इसके बाद, नए प्रोजेक्टेड कॉन्टेक्स्ट का इस्तेमाल करके, किसी भी सिस्टम सेवा या संसाधन को फिर से शुरू किया जा सकता है.

चश्मे के माइक्रोफ़ोन से ऑडियो रिकॉर्ड करना

चश्मे से ऑडियो रिकॉर्ड करने के दो अलग-अलग तरीके हैं:

रिकॉर्ड करने के तरीके चुनना

आपके लिए कौनसा तरीका सही है, यह इस बात पर निर्भर करता है कि आपको हाई-फ़िडेलिटी, XR के लिए खास तौर पर ऑडियो प्रोसेसिंग या स्टैंडर्ड ब्लूटूथ ऑडियो इनपुट की ज़रूरत है या नहीं.

रिकॉर्ड करने का तरीका माइक्रोफ़ोन का ऐक्सेस आम तौर पर इस्तेमाल की जाने वाली स्थिति

प्रोजेक्टेड कॉन्टेक्स्ट

एक से ज़्यादा माइक्रोफ़ोन

प्रोजेक्टेड कॉन्टेक्स्ट का इस्तेमाल करके रिकॉर्ड करने से, आपका ऐप्लिकेशन स्मार्ट ग्लास के एक से ज़्यादा माइक्रोफ़ोन और उसकी खास हार्डवेयर सुविधाओं को ऐक्सेस कर सकता है. जैसे:

  • XR के लिए खास तौर पर बनी स्पेसियलाइज़ेशन की सुविधा.
  • बेहतर डीनॉइज़िंग की सुविधा.
  • आवाज़ अलग करने की सुविधा, जो पहनने वाले व्यक्ति की आवाज़ को अलग करती है.
  • मल्टीडिवाइस एनवायरमेंट में रिकॉर्डिंग ऐक्सेस बनाए रखना. भले ही, चश्मा ऐक्टिव ब्लूटूथ डिवाइस न हो.

ब्लूटूथ एचएफ़पी

एक माइक्रोफ़ोन

तुरंत, आउट-ऑफ़-द-बॉक्स कंपैटिबिलिटी के लिए, ब्लूटूथ हैंड्स-फ़्री प्रोफ़ाइल (एचएफ़पी) पर निर्भर करता है. इस मोड में, चश्मा, स्टैंडर्ड हेडसेट और एडवांस्ड ऑडियो डिस्ट्रीब्यूशन प्रोफ़ाइल (A2DP) प्रोफ़ाइल का इस्तेमाल करके फ़ोन से कनेक्ट होता है. यह एक सामान्य ब्लूटूथ पेरिफ़ेरल की तरह काम करता है.

अगर आपका ऐप्लिकेशन, स्टैंडर्ड ब्लूटूथ रिकॉर्डिंग के लिए पहले से ही डिज़ाइन किया गया है, तो XR के लिए खास तौर पर बनी किसी भी सुविधा को इंटिग्रेट किए बिना, चश्मे से ऑडियो रिकॉर्ड करने के लिए इस तरीके का इस्तेमाल किया जा सकता है.

प्रोजेक्टेड कॉन्टेक्स्ट का इस्तेमाल करके ऑडियो रिकॉर्ड करना

प्रोजेक्टेड कॉन्टेक्स्ट का इस्तेमाल करके ऑडियो रिकॉर्ड करने के लिए, पहले ज़रूरी रनटाइम अनुमतियों का अनुरोध करें. इसके बाद, AudioRecord एपीआई का इस्तेमाल करके ऑडियो रिकॉर्ड करें. इसके बारे में, यहां दिए गए सेक्शन में बताया गया है.

रनटाइम अनुमतियों का अनुरोध करना

चश्मे पर मौजूद एक से ज़्यादा माइक्रोफ़ोन को ऐक्सेस करने के लिए, आपको प्रोजेक्टेड डिवाइस के लिए खास तौर पर ऑडियो अनुमतियों का अनुरोध करना होगा. फ़ोन के दायरे वाली स्टैंडर्ड RECORD_AUDIO अनुमति काफ़ी नहीं है. यह अनुमति, उपयोगकर्ता ने अपने मोबाइल डिवाइस पर आपके ऐप्लिकेशन को दी है.

अनुमतियों का अनुरोध करने के लिए, यह तरीका अपनाएं:

  1. अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में, RECORD_AUDIO अनुमति का एलान करें.
  2. प्रोजेक्टेड-डिवाइस के दायरे वाली अनुमतियों का अनुरोध, इनमें से किसी एक तरीके से करें. यह इस बात पर निर्भर करता है कि आपका कोड कहां चल रहा है:

प्रोजेक्टेड कॉन्टेक्स्ट के साथ AudioRecord को शुरू करना

यह पक्का करने के लिए कि ऑडियो, होस्ट फ़ोन के बजाय चश्मे से रिकॉर्ड किया जाए, आपको AudioRecord ऑब्जेक्ट को प्रोजेक्टेड डिवाइस कॉन्टेक्स्ट से जोड़ना होगा.

यहां दिए गए कोड में, AudioRecord.Builder का इस्तेमाल किया गया है. साथ ही, projectedDeviceContext को setContext तरीके में पास किया गया है:

// Initialize AudioRecord with projected device context
val audioRecord = AudioRecord.Builder()
    .setAudioSource(MediaRecorder.AudioSource.CAMCORDER)
    .setAudioFormat(audioFormat)
    .setBufferSizeInBytes(bufferSize)
    // pass in the projected device context
    .setContext(projectedDeviceContext)
    .build()

audioRecord.startRecording()

कोड के बारे में अहम बातें
  • ऑडियो सोर्स को CAMCORDER, VOICE_RECOGNITION, VOICE_COMMUNICATION, या UNPROCESSED पर सेट किया जा सकता है, ताकि ऑडियो प्रोसेसिंग को अपने इस्तेमाल के हिसाब से बनाया जा सके.

    उदाहरण के लिए, अगर आपके इस्तेमाल के लिए, आवाज़ में से शोर कम करने की सुविधा या पहनने वाले व्यक्ति की आवाज़ को अलग करने की सुविधा की ज़रूरत है, तो VOICE_COMMUNICATION का इस्तेमाल करें. VOICE_RECOGNITION को ऐको कैंसल करने की सुविधा (एईसी) के साथ प्रोसेस किया जाता है. यह तब काम आ सकता है, जब रिकॉर्डिंग के दौरान ऑडियो चलाया जा रहा हो. अगर आपको बिना किसी बदलाव वाला ऑडियो चाहिए, तो UNPROCESSED या CAMCORDER चुनें.

  • चश्मे के साथ कंपैटिबिलिटी पक्का करने के लिए, audioFormat ऑब्जेक्ट में 16kHz की सैंपल रेट और मोनो या स्टीरियो (CHANNEL_IN_MONO या CHANNEL_IN_STEREO का इस्तेमाल करके) का चैनल कॉन्फ़िगरेशन तय करना होगा.

  • AudioRecord.getMinBufferSize() ऑब्जेक्ट बनाने के लिए, कम से कम बफ़र साइज़ तय करने के लिए, AudioRecord का इस्तेमाल करें. हालांकि, चश्मे से ऑडियो ड्रॉप होने से रोकने के लिए, आपको इस बफ़र से छोटे-छोटे, बार-बार चंक (आदर्श तौर पर 20 मिसेकंड के स्लाइस) में पढ़ना चाहिए. पूरे बफ़र के भरने का इंतज़ार नहीं करना चाहिए.

इस्तेमाल के बाद, साफ़ करें

जब आपके ऐप्लिकेशन को माइक्रोफ़ोन की ज़रूरत न हो या ऐक्टिविटी बंद हो जाए, तो stop और release को AudioRecord ऑब्जेक्ट पर कॉल करें.

रिकॉर्डिंग से पहले, रनटाइम अनुमतियों की जांच करना

startRecording को कॉल करने से पहले, पुष्टि करें कि उपयोगकर्ता ने प्रोजेक्टेड कॉन्टेक्स्ट का इस्तेमाल करके, चश्मे के लिए माइक्रोफ़ोन की अनुमति दी है.

ब्लूटूथ एचएफ़पी का इस्तेमाल करके ऑडियो रिकॉर्ड करना

ब्लूटूथ एचएफ़पी का इस्तेमाल करके ऑडियो रिकॉर्ड करने के लिए, पहले ज़रूरी रनटाइम अनुमतियों का अनुरोध करें. इसके बाद, AudioManager एपीआई का इस्तेमाल करके ऑडियो रिकॉर्ड करें. इसके बारे में, यहां दिए गए सेक्शन में बताया गया है.

अनुमतियों का अनुरोध करें

किसी भी स्टैंडर्ड ब्लूटूथ ऑडियो डिवाइस की तरह, RECORD_AUDIO, BLUETOOTH_CONNECT वगैरह से जुड़ी अनुमतियां, फ़ोन से कंट्रोल की जाती हैं. कनेक्ट किए गए डिवाइस (जैसे, ऑडियो वाले चश्मे या डिसप्ले वाले चश्मे) से नहीं.

अनुमतियों का अनुरोध करने के लिए, यह तरीका अपनाएं:

  1. अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में, ये अनुमतियां तय करें:

  2. Android की अनुमति के standard फ़्लो का इस्तेमाल करके, रनटाइम में RECORD_AUDIO और BLUETOOTH_CONNECT, दोनों अनुमतियों का अनुरोध करें.

ऑडियो रूट करने के लिए, AudioManager का इस्तेमाल करना

उपयोगकर्ता के आपके ऐप्लिकेशन को ज़रूरी रनटाइम अनुमतियां देने के बाद, ब्लूटूथ एचएफ़पी के ज़रिए ऑडियो रूट करने के लिए, AudioManager एपीआई का इस्तेमाल करके, कम्यूनिकेशन डिवाइस को TYPE_BLUETOOTH_SCO पर सेट करें. इससे सिस्टम को ब्लूटूथ पेरिफ़ेरल से ऑडियो पाने का निर्देश मिलता है.

val audioManager = context.getSystemService(AudioManager::class.java) ?: return
val devices = audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS)
val hfpDevice = devices.find { it.type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO }

hfpDevice?.let { device ->
    val audioRecord = AudioRecord.Builder()
        .setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION)
        .setAudioFormat(audioFormat)
        .setBufferSizeInBytes(bufferSize)
        .build()

    // Route recording to the Bluetooth device
    audioRecord.setPreferredDevice(device)
    audioManager.setCommunicationDevice(device)

    audioRecord.startRecording()

चश्मे के कैमरे से इमेज कैप्चर करना

चश्मे के कैमरे से इमेज कैप्चर करने के लिए, अपने ऐप्लिकेशन के लिए सही कॉन्टेक्स्ट का इस्तेमाल करके, CameraX के ImageCapture यूज़ केस को चश्मे के कैमरे से सेट अप और बाइंड करें:

private fun startCameraOnGlasses(activity: ComponentActivity) {
    activity.lifecycleScope.launch {
        // Before creating a projected context, check to see if the projected device is connected.
        ProjectedContext.isProjectedDeviceConnected(activity, coroutineContext)
            .collectLatest { isConnected ->
                if (isConnected) {
                    // 1. Get the CameraProvider using the projected context.
                    // When using the projected context, DEFAULT_BACK_CAMERA maps to the audio and display glasses' camera.
                    val projectedContext = try {
                        ProjectedContext.createProjectedDeviceContext(activity)
                    } catch (e: IllegalStateException) {
                        Log.e(TAG, "Projected context could not be created", e)
                        return@collectLatest
                    }

                    val cameraProviderFuture = ProcessCameraProvider.getInstance(projectedContext)

                    cameraProviderFuture.addListener({
                        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
                        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

                        // 2. Check for the presence of a camera.
                        if (!cameraProvider.hasCamera(cameraSelector)) {
                            Log.w(TAG, "The selected camera is not available.")
                            return@addListener
                        }

                        // 3. Query supported streaming resolutions using Camera2 Interop.
                        val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
                        val camera2CameraInfo = Camera2CameraInfo.from(cameraInfo)
                        val cameraCharacteristics = camera2CameraInfo.getCameraCharacteristic(
                            CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP
                        )

                        // 4. Define the resolution strategy.
                        val targetResolution = Size(1920, 1080)
                        val resolutionStrategy = ResolutionStrategy(
                            targetResolution,
                            ResolutionStrategy.FALLBACK_RULE_CLOSEST_LOWER
                        )
                        val resolutionSelector = ResolutionSelector.Builder()
                            .setResolutionStrategy(resolutionStrategy)
                            .build()

                        // 5. If you have other continuous use cases bound, such as Preview or ImageAnalysis,
                        // you can use  Camera2 Interop's CaptureRequestOptions to set the FPS
                        val fpsRange = Range(30, 60)
                        val captureRequestOptions = CaptureRequestOptions.Builder()
                            .setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange)
                            .build()

                        // 6. Initialize the ImageCapture use case with options.
                        val imageCapture = ImageCapture.Builder()
                            // Optional: Configure resolution, format, etc.
                            .setResolutionSelector(resolutionSelector)
                            .build()

                        try {
                            // Unbind use cases before rebinding.
                            cameraProvider.unbindAll()

                            // Bind use cases to camera using the Activity as the LifecycleOwner.
                            cameraProvider.bindToLifecycle(
                                activity,
                                cameraSelector,
                                imageCapture
                            )
                        } catch (exc: Exception) {
                            Log.e(TAG, "Use case binding failed", exc)
                        }
                    }, ContextCompat.getMainExecutor(activity))
                }
            }
    }
}

कोड के बारे में अहम बातें

  • ProcessCameraProvider का इस्तेमाल करके, **प्रोजेक्टेड डिवाइस कॉन्टेक्स्ट** का इंस्टेंस पाता है.
  • कैमरा चुनते समय, प्रोजेक्टेड कॉन्टेक्स्ट के दायरे में, चश्मे का प्राइमरी, बाहर की ओर पॉइंट करने वाला कैमरा, DEFAULT_BACK_CAMERA पर मैप होता है.
  • प्री-बाइंडिंग की जांच में, यह पुष्टि करने के लिए cameraProvider.hasCamera(cameraSelector) का इस्तेमाल किया जाता है कि चुनी गई कैमरा, डिवाइस पर उपलब्ध है या नहीं.
  • सपोर्ट किए गए रिज़ॉल्यूशन की ऐडवांस जांच के लिए, Camera2 Interop का इस्तेमाल Camera2CameraInfo के साथ किया जाता है. इससे, अंडरलाइंग CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP को पढ़ा जा सकता है.
  • ImageCapture के लिए, आउटपुट इमेज रिज़ॉल्यूशन को सटीक तरीके से कंट्रोल करने के लिए, कस्टम ResolutionSelector बनाया जाता है.
  • ImageCapture यूज़ केस बनाता है, जिसे कस्टम ResolutionSelector के साथ कॉन्फ़िगर किया जाता है.
  • ImageCapture यूज़ केस को ऐक्टिविटी की लाइफ़साइकल से बाइंड करता है. इससे, ऐक्टिविटी की स्थिति के आधार पर, कैमरा को अपने-आप खोला और बंद किया जाता है. उदाहरण के लिए, ऐक्टिविटी के पॉज़ होने पर कैमरा बंद हो जाता है.
  • सिंगल-स्ट्रीम हार्डवेयर के लिए कॉन्फ़िगर करना: चश्मे का कैमरा पाइपलाइन, एक बार में सिर्फ़ एक ऐक्टिव स्ट्रीम तक सीमित होती है. जब ImageCapture को अकेले बाइंड किया जाता है, तो CameraX, फ़ोकस और मीटरिंग के लिए डिफ़ॉल्ट रूप से, इंटरनल रिपीटिंग स्ट्रीम (MeteringRepeating) अटैच करता है. इससे, सिंगल-स्ट्रीम पाइपलाइन रुक जाती है. प्रीव्यू स्ट्रीम के बिना, ImageCapture को अकेले बाइंड करने के लिए, CameraXConfig.Builder पर setRepeatingStreamForced(false) सेट करके, फ़ोर्स्ड रिपीटिंग स्ट्रीम को बंद करें. उदाहरण के लिए, अपनी Application क्लास में CameraXConfig.Provider लागू करके या शुरू करने से पहले ProcessCameraProvider को कॉन्फ़िगर करके.

चश्मे का कैमरा सेट अप करने के बाद, CameraX की ImageCapture क्लास से इमेज कैप्चर की जा सकती है. इमेज कैप्चर करने के लिए, takePicture का इस्तेमाल करने के बारे में जानने के लिए, CameraX का दस्तावेज़ देखें.

चश्मे के कैमरे से वीडियो कैप्चर करना

चश्मे के कैमरे से इमेज के बजाय वीडियो कैप्चर करने के लिए, ImageCapture कॉम्पोनेंट को, उससे जुड़े VideoCapture कॉम्पोनेंट से बदलें . साथ ही, कैप्चर करने की लॉजिक में बदलाव करें.

मुख्य बदलावों में, अलग यूज़ केस का इस्तेमाल करना, अलग आउटपुट फ़ाइल बनाना, और वीडियो रिकॉर्ड करने के सही तरीके का इस्तेमाल करके कैप्चर शुरू करना शामिल है. VideoCapture एपीआई और इसका इस्तेमाल करने के तरीके के बारे में ज़्यादा जानने के लिए, CameraX का वीडियो कैप्चर करने से जुड़ा दस्तावेज़ देखें.

यहां दी गई टेबल में, आपके ऐप्लिकेशन के यूज़ केस के हिसाब से, सुझाया गया रिज़ॉल्यूशन और फ़्रेम रेट दिखाया गया है:

इस्तेमाल का उदाहरण रिज़ॉल्यूशन फ़्रेम दर
वीडियो कम्यूनिकेशन 1280 x 720 15 एफ़पीएस
कंप्यूटर विज़न 640 x 480 10 एफ़पीएस
एआई वीडियो स्ट्रीमिंग 640 x 480 1 एफ़पीएस

प्रोजेक्टेड ऐक्टिविटी से फ़ोन के हार्डवेयर को ऐक्सेस करना

प्रोजेक्टेड ऐक्टिविटी, फ़ोन के हार्डवेयर (जैसे, कैमरा या माइक्रोफ़ोन) को भी ऐक्सेस कर सकती है. इसके लिए, होस्ट डिवाइस (फ़ोन) का कॉन्टेक्स्ट पाने के लिए, createHostDeviceContext(context) का इस्तेमाल करें:

@OptIn(ExperimentalProjectedApi::class)
private fun getPhoneContext(activity: ComponentActivity): Context? {
    return try {
        // From a projected Activity, get a context for the phone.
        ProjectedContext.createHostDeviceContext(activity)
    } catch (e: IllegalStateException) {
        Log.e(TAG, "Failed to create host device context", e)
        null
    }
}

हाइब्रिड ऐप्लिकेशन (मोबाइल और चश्मे, दोनों के लिए अनुभव देने वाला ऐप्लिकेशन) में, होस्ट डिवाइस (फ़ोन) के लिए खास तौर पर बने हार्डवेयर या संसाधनों को ऐक्सेस करते समय, आपको साफ़ तौर पर सही कॉन्टेक्स्ट चुनना होगा. इससे यह पक्का किया जा सकेगा कि आपका ऐप्लिकेशन सही हार्डवेयर को ऐक्सेस कर सके:

  • फ़ोन का Activity कॉन्टेक्स्ट पाने के लिए, फ़ोन की Activity या ProjectedContext.createHostDeviceContext का इस्तेमाल करें.
  • getApplicationContext का इस्तेमाल न करें, क्योंकि ऐप्लिकेशन कॉन्टेक्स्ट अगर प्रोजेक्टेड ऐक्टिविटी, हाल ही में लॉन्च किया गया कॉम्पोनेंट है, तो स्मार्ट ग्लास का कॉन्टेक्स्ट गलत तरीके से दिखा सकता है.