انواع مختلف عینکهای صوتی و عینکهای نمایشگردار قابلیتهای متفاوتی دارند. پساز برنامهریزی برای نحوه پشتیبانی از انواع مختلف دستگاههای هوش مصنوعی، میتوانید قابلیتهای دستگاه را در زمان اجرا بررسی کنید تا بهترین تجربه را برای دستگاه کاربر ارائه دهید.
بررسی اینکه دستگاه نمایشگر دارد یا نه
عینک نمایشگردار میتواند میاناهای کاربر ساختهشده با 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) }