ऑडियो ग्लास के लिए फ़िज़िकल इनपुट रूटिंग के बारे में जानकारी

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

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

सिस्टम, उपयोगकर्ता की जागरूकता का पता कैसे लगाता है

सिस्टम, उपयोगकर्ता की जागरूकता का पता लगाने के लिए, इनमें से कौनसी डेटा स्ट्रीम चालू हैं, इस पर नज़र रखता है:

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

कुछ डेटा स्ट्रीम कुछ समय के लिए होती हैं और उपयोगकर्ता को सिर्फ़ कुछ समय के लिए जानकारी देती हैं. उदाहरण के लिए, किसी रास्ते पर नेविगेट करते समय, उपयोगकर्ता को अगले मोड़ के बारे में ऑडियो के ज़रिए जानकारी देना. अन्य डेटा स्ट्रीम अनिश्चित होती हैं. इनमें उपयोगकर्ता की जानकारी तब तक सेव रहती है, जब तक वे जारी रहती हैं. उदाहरण के लिए, कभी न खत्म होने वाली और रैंडम प्लेलिस्ट के साथ मीडिया प्लेबैक. जब कोई ट्रांज़िएंट डेटा स्ट्रीम, इंडेफ़िनिट डेटा स्ट्रीम में रुकावट डालती है, तो उपयोगकर्ता का ध्यान कुछ समय के लिए उस पर जाता है.

एक साथ कई काम करना और इनपुट फ़ोकस

उपयोगकर्ता अक्सर ऑडियो ग्लास पर, एक साथ कई ऐप्लिकेशन इस्तेमाल करते हैं. उदाहरण के लिए, हो सकता है कि कोई उपयोगकर्ता रास्ते के दिशा-निर्देशों का इस्तेमाल करते समय संगीत सुन रहा हो. ऐसे मामलों में, सिस्टम एक साथ होने वाली स्थिति असाइन करता है और इनपुट फ़ोकस को ऑडियो फ़ोकस से मैच करने के लिए शिफ़्ट करता है. इसके लिए, वह ये काम करता है:

  • अपने ऐप्लिकेशन की अनुमानित गतिविधि को फिर से शुरू करना या रोकना.
  • फ़ोरग्राउंड में प्रोजेक्ट की गई गतिविधि पर फ़िज़िकल इनपुट को रूट करना.

इस तरीके से, उपयोगकर्ताओं को एक जैसा अनुभव मिलता है.

सिस्टम को आपकी प्रोजेक्ट की गई गतिविधि को फिर से लॉन्च करने की अनुमति देना

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

यह पक्का करने के लिए कि सिस्टम आपकी गतिविधि को फिर से लॉन्च कर सके:

  1. पेंडिंग इंटेंट बनाएं: साफ़ तौर पर बताया गया Intent बनाएं, जो आपकी टारगेट की गई प्रोजेक्टेड ऐक्टिविटी पर ले जाए. इंटेंट को PendingIntent में रैप करें और FLAG_UPDATE_CURRENT या FLAG_IMMUTABLE सेट करें, ताकि ऐप्लिकेशन को सुरक्षित और अनुमानित तरीके से लॉन्च किया जा सके:

    // Build an explicit Intent pointing to this projected activity and wrap it in a
    // PendingIntent so the system can relaunch it and route physical input to it.
    private val pendingIntent: PendingIntent by lazy {
        val intent = Intent(this, ProjectedInputFocusActivity::class.java)
    
        PendingIntent.getActivity(
            this,
            0,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
    }

  2. इनपुट रिसीवर को रजिस्टर करना: ProjectedActivityCompat का इंस्टेंस पाएं और अपने PendingIntent को तय किए गए इनपुट रिसीवर के तौर पर रजिस्टर करें. इसके लिए, इसे setActivityAsInputReceiver में पास करें.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        lifecycleScope.launch {
            // Create or obtain the ProjectedActivityCompat instance
            val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity)
    
            // Register the PendingIntent as the designated input receiver
            projectedActivity.setActivityAsInputReceiver(pendingIntent)
        }

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

    override fun onDestroy() {
        super.onDestroy()
        lifecycleScope.launch {
            val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity)
            projectedActivity.clearActivityAsInputReceiver()
        }
    }

यह समझना कि इनपुट फ़ोकस, एक साथ होने वाली स्थितियों के बीच कैसे शिफ़्ट होता है

यह तय करने के लिए कि किस ऐप्लिकेशन को इनपुट फ़ोकस मिले, सिस्टम चालू डेटा स्ट्रीम का आकलन करता है. साथ ही, एक साथ होने वाली इन स्थितियों के आधार पर इनपुट को रूट करता है:

कॉनकरंसी की स्थिति पर्यावरण से जुड़ा कॉन्टेक्स्ट सिस्टम का व्यवहार और इनपुट फ़ोकस उदाहरण

एक साथ न होने वाले

प्रोजेक्ट की गई कोई गतिविधि अलग से चालू हो और बैकग्राउंड में कोई मीडिया सेशन न चल रहा हो.

इनपुट फ़ोकस पूरी तरह से आपकी प्रोजेक्ट की गई गतिविधि पर भेजा जाता है. ऐसा तब भी होता है, जब रीडआउट के बीच में कुछ समय के लिए आवाज़ नहीं आती.

कोई उपयोगकर्ता, कसरत ट्रैक करने वाला ऐप्लिकेशन चलाता है. शांत माहौल में भी, टचपैड इनपुट सीधे फ़िटनेस ऐप्लिकेशन पर भेजे जाते हैं.

सेमी-कॉन्करेंट

प्रोजेक्ट की गई कोई गतिविधि चालू है, लेकिन बैकग्राउंड में मीडिया सेशन रुका हुआ है.

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

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

एक साथ

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

ऑडियो फ़ोकस, इनपुट फ़ोकस के बराबर होता है.

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

कोई उपयोगकर्ता संगीत सुन रहा है और उसी समय नेविगेशन ऐप्लिकेशन, निर्देश पढ़कर सुनाता है. जानकारी पढ़ने के दौरान, नेविगेशन ऐप्लिकेशन को इनपुट फ़ोकस मिलता है. पढ़ने की प्रोसेस पूरी होने के बाद, इनपुट फ़ोकस वापस मीडिया कंट्रोल पर शिफ़्ट हो जाता है.

सिस्टम के टाइमिंग सेफ़गार्ड

सिस्टम, उपयोगकर्ताओं को गलती से होने वाले इनपुट या अनचाहे व्यवहार से बचाने के लिए, ये सुरक्षा सुविधाएं उपलब्ध कराता है:

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

इनपुट फ़ोकस ट्रांज़िशन को प्रैक्टिस में लाना

इनपुट फ़ोकस, एक साथ होने वाली गतिविधियों के बीच कैसे ट्रांज़िशन करता है, यह समझने के लिए मोड़-दर-मोड़ दिशा-निर्देश देने वाले नेविगेशन ऐप्लिकेशन के ये उदाहरण देखें:

स्थिति A: नॉन-कॉन्करेंट (इनऐक्टिव मीडिया)

इस मामले में, सिस्टम इनपुट को नेविगेशन ऐप्लिकेशन पर भेजता है. इस ऐप्लिकेशन को पूरी यात्रा के दौरान उपयोगकर्ता की जानकारी होती है.

पहली इमेज. इस नॉन-कॉन्करेंट स्थिति में, नेविगेशन ऐप्लिकेशन के लिए इनपुट फ़ोकस को कैसे रूट किया जाएगा.
  1. उपयोगकर्ता नेविगेशन की सुविधा चालू करता है और बैकग्राउंड में कोई संगीत नहीं चल रहा होता है.
  2. नेविगेशन ऐप्लिकेशन, ऑडियो ग्लास पर अपनी प्रोजेक्ट की गई गतिविधि को लॉन्च करता है.
  3. कोई मीडिया सेशन चालू न होने की वजह से, नेविगेशन ऐप्लिकेशन पूरी यात्रा के दौरान टचपैड इनपुट फ़ोकस बनाए रखता है.
  4. उपयोगकर्ता की कार्रवाइयां: जानकारी को ज़ोर से पढ़े जाने के दौरान टैप करने से, निर्देश म्यूट हो सकते हैं. जब TalkBack कुछ न बोल रहा हो, तब टैप करने पर पिछली जानकारी को दोहराया जा सकता है.

दूसरी स्थिति: सेमी-कॉन्करेंट (रोका गया मीडिया)

इस स्थिति में, सिस्टम इनपुट को सिस्टम मीडिया कंट्रोल पर तब भेजता है, जब नेविगेशन ऐप्लिकेशन को उपयोगकर्ता की जानकारी नहीं होती.

दूसरी इमेज. इस सेमी-कॉन्करेंट स्थिति में, नेविगेशन ऐप्लिकेशन के लिए इनपुट फ़ोकस को कैसे रूट किया जाएगा.
  1. उपयोगकर्ता नेविगेशन लॉन्च करता है, जबकि बैकग्राउंड में चल रहा संगीत रुका हुआ है.
  2. टेक्स्ट पढ़ने के दौरान, जब कुछ समय के लिए आवाज़ नहीं आती, तब इनपुट फ़ोकस डिफ़ॉल्ट रूप से मीडिया कंट्रोल पर सेट हो जाता है.
  3. जब नेविगेशन ऐप्लिकेशन "500 फ़ीट के बाद, बाएं मुड़ें" बोलता है, तो उसे इनपुट फ़ोकस मिलता है.
  4. उपयोगकर्ता की कार्रवाइयां: जानकारी पढ़ने के दौरान टैप करने से, निर्देश म्यूट हो सकते हैं. संगीत बंद होने पर, पर टैप करने से संगीत फिर से चलने लगता है.

स्थिति C: एक साथ कई डिवाइसों पर (ऐक्टिव मीडिया)

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

तीसरी इमेज. इस तरह की स्थिति में, नेविगेशन ऐप्लिकेशन के लिए इनपुट फ़ोकस को कैसे रूट किया जाएगा.
  1. उपयोगकर्ता, संगीत चलने के दौरान नेविगेशन लॉन्च करता है.
  2. निर्देशों को पढ़कर सुनाने के दौरान, सिस्टम बैकग्राउंड ऑडियो को कम कर देता है और इनपुट फ़ोकस को नेविगेशन ऐप्लिकेशन पर शिफ़्ट कर देता है.
  3. उपयोगकर्ता की कार्रवाइयां: जानकारी पढ़ने के दौरान टैप करने से, निर्देश म्यूट हो सकते हैं. जब कोई आवाज़ न आ रही हो, तब टैप करने से मीडिया प्लेबैक को कंट्रोल किया जा सकता है. जैसे, मीडिया को रोकना या फिर से चलाना.