Ses gözlüğü ve ekran gözlüğü için çalışma zamanında cihaz özelliklerini kontrol etme

Uygun XR cihazlar
Bu kılavuz, bu tür XR cihazları için deneyimler geliştirmenize yardımcı olur.
Ses ve
Görüntü Arabirimli Gözlük

Farklı ses arabirimli gözlük ve görüntü arabirimli gözlük türlerinin farklı özellikleri vardır. Farklı yapay zeka cihaz türlerini nasıl destekleyeceğinizi planladıktan sonra, kullanıcının cihazı için en iyi deneyimi sunmak üzere çalışma zamanında cihaz özelliklerini kontrol edebilirsiniz.

Cihazın ekranı olup olmadığını kontrol etme

Görüntülü gözlükler, Jetpack Compose Glimmer ile oluşturulmuş kullanıcı arayüzlerini gösterebilir. Aşağıdaki örnekte, gözlük cihazında ekran olup olmadığının nasıl kontrol edileceği gösterilmektedir:

// Check device capabilities
val projectedDeviceController = ProjectedDeviceController.create(this@ProjectedMainActivity)
isVisualUiSupported = projectedDeviceController.capabilities.contains(CAPABILITY_VISUAL_UI)

Ekran durumu değişikliklerine tepki verme

Görüntülü gözlüklerde ekran zaman aşımına uğrayabilir veya kullanıcı ekranı kapatabilir. Ekran açık veya kapalıyken çalışan etkinlikler tasarlamak için ekran durumu değiştiğinde bildirim almak üzere addPresentationModeChangedListener kullanın. Etkinliğinizi, görüntüleme durumuna bağlı olarak uygun miktarda ses bilgisi için ayarlayabilirsiniz.

ProjectedDisplayController.create(activity).addPresentationModeChangedListener {
    presentationModeFlags ->

    val areVisualsOff = !presentationModeFlags.hasPresentationMode(VISUALS_ON)
}

Ekranı açık tutma

Görüntülü gözlüklerde, addLayoutParamsFlags kullanarak sistemin ekranı açık tutmasını ve ekranın zaman aşımına uğramasını önlemesini isteyebilirsiniz.

var projectedDisplayController = ProjectedDisplayController.create(activity)

projectedDisplayController.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

Pil durumu değişikliklerini izleme

Bağlı ses veya görüntülü gözlüklerin anlık pil durumunu takip etmek için ProjectedDeviceController tarafından sağlanan addBatteryStateChangedListener yöntemini kullanın. Bu dinleyici, pil seviyesi veya şarj durumu değiştiğinde uygulamanızı bilgilendirerek uygulama performansını optimize etmenize, güç tasarrufu modlarını etkinleştirmenize veya kullanıcı arayüzünüzü güncellemenize olanak tanır.

@OptIn(ExperimentalProjectedApi::class)
private var deviceController: ProjectedDeviceController? = null

private val batteryListener = { batteryState: BatteryState ->
    val batteryLevel = batteryState.batteryLevel
    val isCharging = batteryState.isCharging

    if (batteryLevel <= 15 && !isCharging) {
        switchToLowPowerMode()
    }

    updateBatteryUi(batteryLevel, isCharging)
}
// ...

@OptIn(ExperimentalProjectedApi::class)
private fun monitorBatteryStatus() {
    lifecycleScope.launch {
        try {
            if (deviceController == null) {
                deviceController = ProjectedDeviceController.create(this@PhoneMainActivity)
            }

            if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
                deviceController?.addBatteryStateChangedListener(coroutineContext, batteryListener)
            }
        } catch (e: Exception) {
            Log.e("BatteryMonitor", "Unexpected error: ${e.message}")
        }
    }
}

Cihazı izlemeyi tamamladığınızda veya bileşeniniz imha edilirken temel kaynakları düzgün bir şekilde serbest bırakmak için ProjectedDeviceController üzerinde close yöntemini çağırın.

@OptIn(ExperimentalProjectedApi::class)
override fun onDestroy() {
    super.onDestroy()
    // Unregisters the active listeners
    deviceController?.close()
    deviceController = null
}

Ayrıca, kapsam sona ermeden önce removeBatteryStateChangedListener kullanarak bir dinleyicinin kaydını açıkça iptal edebilirsiniz.

@OptIn(ExperimentalProjectedApi::class)
override fun onPause() {
    super.onPause()
    // Explicitly unregister the listener when it is no longer needed
    deviceController?.removeBatteryStateChangedListener(batteryListener)
}