قابلیت‌های دستگاه را در زمان اجرا برای عینک‌های صوتی و عینک‌های نمایشگر بررسی کنید

دستگاه‌های XR واجدشرایط
این راهنمایی به شما کمک می‌کند برای این نوع دستگاه‌های واقعیت گسترده تجربه بسازید.
عینک
نمایشگردار و صوتی

انواع مختلف عینک‌های صوتی و عینک‌های نمایشگردار قابلیت‌های متفاوتی دارند. پس‌از برنامه‌ریزی برای نحوه پشتیبانی از انواع مختلف دستگاه‌های هوش مصنوعی، می‌توانید قابلیت‌های دستگاه را در زمان اجرا بررسی کنید تا بهترین تجربه را برای دستگاه کاربر ارائه دهید.

بررسی اینکه دستگاه نمایشگر دارد یا نه

عینک نمایشگردار می‌تواند میاناهای کاربر ساخته‌شده با Jetpack Compose Glimmer را نشان دهد. مثال زیر نشان می‌دهد که چگونه می‌توان بررسی کرد که آیا دستگاه عینک دارای نمایشگر است یا نه:

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

واکنش نشان دادن به تغییرات وضعیت نمایشگر

در عینک نمایشگردار، نمایشگر می‌تواند مهلتش تمام شود یا کاربر می‌تواند نمایشگر را خاموش کند. برای طراحی فعالیت‌هایی که چه نمایشگر روشن باشد چه خاموش اجرا می‌شوند، از addPresentationModeChangedListener استفاده کنید تا وقتی وضعیت نمایشگر تغییر می‌کند مطلع شوید. می‌توانید فعالیتتان را برای مقدار مناسب اطلاعات صوتی بسته به وضعیت نمایش تنظیم کنید.

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

    val areVisualsOff = !presentationModeFlags.hasPresentationMode(VISUALS_ON)
}

روشن نگه داشتن نمایشگر

در عینک نمایشگردار، می‌توانید از سیستم بخواهید که صفحه‌نمایش را روشن نگه دارد و بااستفاده از addLayoutParamsFlags از تمام شدن زمان صفحه‌نمایش جلوگیری کند.

var projectedDisplayController = ProjectedDisplayController.create(activity)

projectedDisplayController.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

نظارت بر تغییرات وضعیت باتری

برای ردیابی وضعیت باتری عینک نمایشگردار یا صوتی متصل‌شده به‌صورت هم‌زمان، از روش addBatteryStateChangedListener ارائه‌شده توسط ProjectedDeviceController استفاده کنید. این شنونده هرگاه سطح باتری یا وضعیت شارژ تغییر کند به برنامه شما اطلاع می‌دهد و به شما امکان می‌دهد عملکرد برنامه را بهینه‌سازی کنید، حالت‌های ذخیره انرژی را فعال کنید، یا میانای کاربر را به‌روز کنید.

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

وقتی پایش دستگاه تمام شد یا وقتی مؤلفه شما درحال تخریب است، close را در ProjectedDeviceController فراخوانی کنید تا منابع زیربنایی به‌درستی آزاد شوند.

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

همچنین می‌توانید بااستفاده از removeBatteryStateChangedListener، قبل‌از پایان یافتن دامنه، به‌طور صریح ثبت‌نام شنونده را لغو کنید.

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