ऑडियो और डिसप्ले ग्लास से मिलने वाले फ़िज़िकल इनपुट को मैनेज करना

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

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

कैमरे से जुड़ी कार्रवाई को मैनेज करना

जब भी कोई उपयोगकर्ता डिवाइस के कैमरे का बटन दबाता है, तो सिस्टम, आपके ऐप्लिकेशन की प्रोजेक्ट की गई गतिविधि को ProjectedInputEvent.ProjectedInputAction.TOGGLE_APP_CAMERA कार्रवाई के तौर पर इनपुट इवेंट डिलीवर करता है. आपका ऐप्लिकेशन, इस कार्रवाई को खास डिसपैचर का इस्तेमाल करके देख सकता है:

@OptIn(ExperimentalProjectedApi::class)
class CameraActionInputSnippetActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Observe hardware camera action events when RESUMED
        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.RESUMED) {
                withContext(Dispatchers.Default) {
                    try {
                        val projectedActivity = ProjectedActivityCompat.create(this@CameraActionInputSnippetActivity)
                        try {
                            projectedActivity.projectedInputEvents.collect { inputEvent ->
                                if (inputEvent.inputAction == TOGGLE_APP_CAMERA) {
                                    withContext(Dispatchers.Main) {
                                        onCameraActionTriggered()
                                    }
                                }
                            }
                        } finally {
                            projectedActivity.close()
                        }
                    } catch (e: CancellationException) {
                        throw e
                    } catch (e: Exception) {
                        Log.w("CameraActionSnippet", "ProjectedActivityCompat unavailable: ${e.message}")
                    }
                }
            }
        }

        setContent {
            GlimmerTheme {
                TouchpadInputSnippet(
                    onTap = { Log.i("CameraActionSnippet", "Touchpad tapped") }
                )
            }
        }
    }

    private fun onCameraActionTriggered() {
        Log.i("CameraActionSnippet", "Camera action button double-pressed!")
    }
}

सामान्य मोशन इवेंट की जांच करना

आपके ऐप्लिकेशन की प्रोजेक्ट की गई गतिविधि को डिलीवर किए गए सामान्य मोशन इवेंट की जांच करने के लिए, dispatchGenericMotionEvent का इस्तेमाल करें. सामान्य मोशन इवेंट, गतिविधि की सीमा पर डिलीवर किए जाते हैं. इसके लिए, फ़ोकस किए गए Jetpack Compose Glimmer कॉम्पोनेंट की ज़रूरत नहीं होती.

MotionEvent में ये चीज़ें शामिल हो सकती हैं:

हर वैल्यू, हर ऐक्शन के लिए काम की नहीं होती. कच्चे इवेंट को जेस्चर के तौर पर मार्क करने से पहले, कार्रवाई और सोर्स की जांच करें.

class MotionGestureInputSnippetActivity : ComponentActivity() {

    override fun dispatchGenericMotionEvent(ev: MotionEvent): Boolean {
        val actionName = when (ev.actionMasked) {
            MotionEvent.ACTION_DOWN -> "ACTION_DOWN" // First contact with the glasses touchpad
            MotionEvent.ACTION_MOVE -> "ACTION_MOVE" // Contact moving across the glasses touchpad
            MotionEvent.ACTION_UP -> "ACTION_UP"     // Contact lifted from the glasses touchpad
            else -> "ACTION_${ev.actionMasked}"
        }

        Log.d(
            "MotionGestureSnippet",
            "MotionEvent: action=$actionName x=${ev.x} y=${ev.y}"
        )

        // Delegate to super unless intentionally consuming the event
        return super.dispatchGenericMotionEvent(ev)
    }
}

true सिर्फ़ तब दिखाएं, जब गतिविधि में इवेंट का इस्तेमाल किया गया हो. ऐसा न होने पर, super.dispatchGenericMotionEvent(ev) वैल्यू को वापस भेजें, ताकि इवेंट को सामान्य तरीके से भेजा जा सके.

सिस्टम के बैक जेस्चर को हैंडल करना

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

उपयोगकर्ता का जेस्चर, स्मार्ट ग्लास के टाइप पर निर्भर करता है:

  • डिसप्ले ग्लास पर, टचपैड पर नीचे की ओर स्वाइप करने से, सिस्टम के पीछे जाने का जेस्चर होता है.
  • ऑडियो ग्लास पर, टचपैड पर वापस स्वाइप करने से, सिस्टम के 'वापस जाएं' जेस्चर का इस्तेमाल होता है.

जब मौजूदा स्क्रीन को 'वापस जाएं' बटन को इंटरसेप्ट करने की ज़रूरत हो, तब बैक कॉलबैक रजिस्टर करें. जैसे, किसी ओवरले को बंद करना या बाहर निकलने की पुष्टि दिखाना.

class BackGestureInputSnippetActivity : ComponentActivity() {

    private val backCallback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            onBackGestureReceived()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Register back gesture callback with Activity's onBackPressedDispatcher
        onBackPressedDispatcher.addCallback(this, backCallback)
    }

    private fun onBackGestureReceived() {
        Log.i("BackGestureSnippet", "System back gesture intercepted")
    }
}

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

अगले चरण

इन इवेंट के लिए इनपुट हैंडलिंग लागू करने के बाद, यहां दिए गए विषयों में अन्य तरह के इनपुट इवेंट को हैंडल करने के बारे में ज़्यादा जानें: