التحقّق من إمكانات الجهاز في وقت التشغيل لنظارات الصوت ونظارات العرض

أجهزة XR المشمولة
تساعدك هذه الإرشادات في إنشاء تجارب لهذه الأنواع من أجهزة 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)
}