Menangani input fisik dari kacamata pintar audio dan layar

Perangkat XR yang kompatibel
Panduan ini membantu Anda membangun pengalaman untuk jenis perangkat XR ini.
Kacamata Audio &
Tampilan

Untuk merekam dan memproses input pengguna yang dikirimkan ke aktivitas yang diproyeksikan aplikasi Anda, atau untuk menerapkan perilaku touchpad kustom, gunakan input pointer tidak langsung. Untuk menangani jenis peristiwa lainnya (seperti tindakan kamera), lihat bagian berikut dalam panduan ini.

Menangani tindakan kamera

Setiap kali pengguna menekan tombol kamera perangkat, sistem akan mengirimkan peristiwa input ke aktivitas yang diproyeksikan aplikasi Anda sebagai tindakan ProjectedInputEvent.ProjectedInputAction.TOGGLE_APP_CAMERA. Aplikasi Anda dapat mengamati tindakan ini menggunakan dispatcher khusus:

@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!")
    }
}

Memeriksa peristiwa gerakan umum

Gunakan dispatchGenericMotionEvent untuk memeriksa peristiwa gerakan umum yang dikirimkan ke aktivitas yang diproyeksikan aplikasi Anda. Peristiwa gerakan generik dikirimkan di batas aktivitas dan tidak memerlukan komponen Jetpack Compose Glimmer yang difokuskan.

MotionEvent dapat mencakup:

Tidak semua nilai bermakna untuk setiap tindakan. Periksa tindakan dan sumber sebelum memperlakukan peristiwa mentah sebagai gestur yang telah selesai.

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)
    }
}

Menampilkan true hanya saat aktivitas sengaja menggunakan peristiwa. Jika tidak, kembalikan super.dispatchGenericMotionEvent(ev) agar peristiwa dapat berlanjut melalui pengiriman normal.

Menangani gestur Kembali sistem

Saat layar memerlukan perilaku kembali kustom, aplikasi Anda harus menangani gestur Kembali kacamata menggunakan API Android yang sama dengan yang Anda gunakan untuk aktivitas lain, seperti OnBackPressedDispatcher dan OnBackPressedCallback.

Gestur pengguna bergantung pada jenis kacamata:

  • Pada kacamata tampilan, menggeser ke bawah pada touchpad akan melakukan gestur Kembali sistem.
  • Pada kacamata pintar audio, menggeser ke belakang di touchpad akan melakukan gestur Kembali sistem.

Mendaftarkan callback kembali saat layar saat ini perlu mencegat Kembali, seperti menutup overlay atau menampilkan konfirmasi keluar.

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")
    }
}

Callback hanya boleh diaktifkan saat layar aktif harus mencegat Kembali. Nonaktifkan atau hapus callback saat perilaku sistem atau navigasi default harus menangani Kembali.

Langkah berikutnya

Setelah menerapkan penanganan input untuk peristiwa ini, Anda dapat mempelajari lebih lanjut cara menangani jenis peristiwa input lainnya dalam topik berikut: