לסוגים שונים של משקפיים עם ממשק קולי ומשקפיים עם תצוגה פנימית יש יכולות שונות. אחרי שתתכננו איך לתמוך בסוגים שונים של מכשירי AI, תוכלו לבדוק את יכולות המכשיר בזמן הריצה כדי לספק את חוויית השימוש הטובה ביותר במכשיר של המשתמש.
איך בודקים אם המכשיר כולל תצוגה
משקפיים עם תצוגה פנימית יכולים להציג ממשקי משתמש שנוצרו באמצעות 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)
מעקב אחרי שינויים במצב הסוללה
כדי לעקוב בזמן אמת אחרי מצב הסוללה של משקפי אודיו או משקפיים עם תצוגה פנימית, משתמשים ב-method 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) }