בדיקת היכולות של משקפי אודיו ומשקפי תצוגה בזמן ריצה

מכשירי XR רלוונטיים
ההנחיות האלה יעזרו לכם ליצור חוויות למכשירי XR מהסוגים הבאים.
משקפיים עם
אודיו ותצוגה פנימית

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