অডিও এবং ডিসপ্লে চশমা থেকে ভৌত ইনপুট পরিচালনা করুন

প্রযোজ্য এক্সআর ডিভাইস
এই নির্দেশিকা আপনাকে এই ধরনের এক্সআর ডিভাইসগুলির জন্য অভিজ্ঞতা তৈরি করতে সাহায্য করে।
অডিও এবং
ডিসপ্লে গ্লাস

আপনার অ্যাপের প্রজেক্টেড অ্যাক্টিভিটিতে আসা ব্যবহারকারীর ইনপুট গ্রহণ ও প্রক্রিয়াকরণ করতে, অথবা কাস্টম টাচপ্যাড আচরণ প্রয়োগ করতে, ইনডাইরেক্ট পয়েন্টার ইনপুট ব্যবহার করুন । অন্যান্য ধরনের ইভেন্ট (যেমন ক্যামেরা অ্যাকশন) পরিচালনা করার জন্য, এই গাইডের পরবর্তী বিভাগগুলো দেখুন।

ক্যামেরার কার্যকলাপ পরিচালনা করুন

যখনই কোনো ব্যবহারকারী ডিভাইসের ক্যামেরা বাটন চাপেন, সিস্টেমটি আপনার অ্যাপের প্রোজেক্টেড অ্যাক্টিভিটিতে একটি 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) রিটার্ন করুন, যাতে ইভেন্টটি স্বাভাবিক ডিসপ্যাচের মাধ্যমে তার কার্যক্রম চালিয়ে যেতে পারে।

সিস্টেমের ব্যাক জেসচার পরিচালনা করুন

যখন কোনো স্ক্রিনে কাস্টম ব্যাক আচরণের প্রয়োজন হয়, তখন আপনার অ্যাপের উচিত অন্যান্য অ্যাক্টিভিটির জন্য ব্যবহৃত একই অ্যান্ড্রয়েড এপিআই, যেমন 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")
    }
}

কলব্যাকটি কেবল তখনই সক্রিয় করা উচিত যখন সক্রিয় স্ক্রিনটি 'ব্যাক' বিকল্পটি গ্রহণ করবে। যখন ডিফল্ট সিস্টেম বা নেভিগেশন আচরণ 'ব্যাক' বিকল্পটি পরিচালনা করবে, তখন কলব্যাকটি নিষ্ক্রিয় বা অপসারণ করুন।

পরবর্তী পদক্ষেপ

এই ইভেন্টগুলোর জন্য ইনপুট হ্যান্ডলিং প্রয়োগ করার পর, আপনি নিম্নলিখিত বিষয়গুলো থেকে অন্যান্য ধরনের ইনপুট ইভেন্ট হ্যান্ডলিং সম্পর্কে আরও জানতে পারবেন: