استهلاك حالة قيادة السيارة والقيود المفروضة على تجربة المستخدم

توضّح هذه الصفحة كيف يمكن للتطبيقات الانتقال بسلاسة إلى نظام تشتت الانتباه. المحسَّنة (DO). ويصف كيفية استهلاك حالة قيادة السيارة بالإضافة إلى قيود تجربة المستخدم المقابلة. لمزيد من المعلومات عن القيود المفروضة على تجربة المستخدم في السيارة (UX)، يُرجى الاطّلاع على القيود المفروضة على تجربة المستخدم في السيارة، التي توضح بالتفصيل حالات القيادة الثلاث، وهي "موقف السيارة" (متوقفة مؤقتًا) و"غير نشِط لفترة قصيرة" و"التنقل".

الجمهور

يتم تقديم هذا المحتوى لأولئك الذين يريدون تصميم تطبيقات تتكيّف مع التغييرات في وحالة قيادة السيارة والقيود المفروضة على تجربة المستخدم وفقًا لذلك.

التفاصيل الفنية

إدارة حالة قيادة السيارة

تُستمد حالة قيادة السيارة (معلّقة أو غير نشِطة أو تتحرك) من قيم أداة الاستشعار التي تقدمها طبقة تجريد أجهزة المركبة (VHAL). المعلومات الأساسية لأداة الاستشعار، مثل سرعة المركبة اختيار الترس الحالي، يستخدم لاستنتاج حالة قيادة المركبة.

CarDrivingStateEvent.

والتي توفر @SystemApis، بمعنى أن الملفات الداخلية للنظام الأساسي وملفات APK المجمّعة (مثل SysUI أو يمكن الوصول إلى واجهات برمجة التطبيقات من خلال حِزم APK المميزة (مثل GMSCore). تتم حماية واجهات برمجة التطبيقات من خلال الأذونات الخاصة بحالة القيادة android.car.permission.CAR_DRIVING_STATE. العملاء التي تتطلّب الوصول إلى معلومات حالة القيادة، يجب طلب هذا الإذن.

CarUxRestrictionsManager

يجب الاستماع إلى التطبيقات التي تعرض واجهة مستخدم تعتمد على حالة القيادة CarUxRestrictionsManager, التي تستبعد التخطيط من حالة القيادة إلى قيود تجربة المستخدم بحيث لا تحتاج التطبيقات إلى للتكيف مع متطلبات السلامة المختلفة في السوق.

ملاحظة: يجب وضع علامة على هذه الأنشطة على أنّها تم تحسين تشتيت الانتباه، كما هو موضح يُرجى الاطّلاع على مقالة إرشادات منع تشتيت السائق. وإذا لم يتم وضع علامة على الأنشطة وفقًا لذلك، سيتم حظرها.

بدلاً من ذلك، تراقب التطبيقات القيود التي يعرضها CarUxRestrictionsManager وليس حالة القيادة المطلقة التي يعرضها CarDriveStateManager لأي شيء يتعلق بالمستخدم واجهة المستخدم أو تجربة المستخدم.

نموذج التعليمات البرمجية

يوضح الرمز النموذجي التالي كيفية مراقبة أحد التطبيقات لقيود تجربة المستخدم:

  1. استيراد حزم مكتبة السيارات:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. تنفيذ CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener). يتم استخدام المستمع عند تسجيله لدى يتم استدعاء CarUxRestrictionsManager عند إجراء تغيير في قيود تجربة المستخدم. تحدث المقابلة. تعامل مع تغييرات القيود لتحسين تشتت الانتباه، حسب الحاجة:
    @Nullable private CarUxRestrictionsManager mCarUxRestrictionsManager;
    private CarUxRestrictions mCurrentUxRestrictions;
    
    /* Implement the onUxRestrictionsChangedListener interface */
    private CarUxRestrictionsManager.OnUxRestrictionsChangedListener mUxrChangeListener =
                new CarUxRestrictionsManager.OnUxRestrictionsChangedListener()
        {
            @Override
            public void onUxRestrictionsChanged(CarUxRestrictions carUxRestrictions) {
            mCurrentUxRestrictions = carUxRestrictions;
            /* Handle the new restrictions */
            handleUxRestrictionsChanged(carUxRestrictions);
            }
        };
      
  3. يمكنك استدعاء واجهات برمجة تطبيقات السيارة لإنشاء مثيل سيارة يُسمى mCar والاتصال بخدمة السيارة:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
    
  4. يمكنك الاتصال بالرقم mCar.getCarManager() - mCarUxRestrictionsManager للحصول على CarUxRestrictionsManager:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. لتسجيل mUxRChangeListener التي تم تنفيذها في الخطوة 2 أعلاه مع الاتصال بـ mCarUxRestrictionsManager.registerListener() من قِبل "CarUxRestrictionsManager":
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

ينتج عن الكتلة المكتملة لنموذج الرمز البرمجي (التي تم إنشاؤها في الخطوة 3 إلى 5) توصيل المستمع تلقّي تغييرات القيود عند تغيير حالة مساحة التخزين السحابي:

mCar = Car.createCar(context);
if (mCar == null) {
// handle car connection error
}

CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);

mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
mUxrChangeListener.onUxRestrictionsChanged(
mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

CarUxRestrictions

يوفّر العنصر CarUxRestrictions نوعَين من المعلومات:

  1. هل هناك متطلب حالي لتحسين مصادر التشتيت؟
  2. إذا كان الأمر كذلك، فما هي القيود المعمول بها حاليًا؟

عند الحصول على CarUxRestrictions من أيّ مما يلي: getCurrentUxRestrictions() أو معاودة اتصال المستمع، يمكن للتطبيقات الآن استخدام isRequiresDistractionOptimization() API لتحديد ما إذا كان "الإلهاء" مشتتًا محسَّنة مطلوبة. إذا أدى ذلك إلى عرض القيمة false، ليس هناك ما يلزم لدرجة الإلهاء. تم تحسين التطبيق وبإمكانه تشغيل أي نشاط بشكل آمن.

إذا كان التحسين مطلوبًا، استخدِم واجهة برمجة التطبيقات getActiveRestrictions() للاطّلاع على مجموعة القيود السارية. هذا النمط تعرض واجهة برمجة التطبيقات int، وهي قناع صغير لجميع القيود السارية حاليًا. تشير رسالة الأشكال البيانية مجموعة القيود التي تم الإبلاغ عنها حاليًا مدرجة ضمن CarUxRestrictions.

ملاحظة: من المتوقع إجراء تغييرات طفيفة على مجموعة القيود تحدث في المستقبل القريب.

على سبيل المثال، إذا أراد أحد التطبيقات تحديد ما إذا كان هناك قيد على تشغيل الفيديو، بناءً على الحصول على الكائن CarUxRestrictions، على التطبيق التحقّق من القيود التالية:

int activeUxR = mCurrentCarUxRestrictions.getActiveRestrictions();
if ((activeUxR & CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO) != 0) {
      handleStopPlayingVideo();
}

حالة القيادة

يعرض CarDriveStateManager حالة القيادة الفعلية للمركبة (موقف سيارات أو بدون توقف أو جارٍ النقل). يمكن استدعاء واجهات برمجة تطبيقات CarDriveStateManager بشكل مشابه لـ CarUxRestrictionsManager. يمكن للتطبيقات تسجيل أدوات معالجة الصوت أو الحصول على الحالة الحالية للقيادة. يتم إرجاع حالة القيادة. مثل CarDriveStateEvent.

CarDrivingStateEvent.

التغييرات، يتم استدعاء طريقة onDrivingStateChanged() مع CarDrivingStateEvent

import android.car.Car;
/* For CarDrivingState */
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarDrivingStateManager;

mDrivingStateManager = (CarDrivingStateManager) mCar.getCarManager(
       Car.CAR_DRIVING_STATE_SERVICE);
/* Register the listener (implemented below) */
mDrivingStateManager.registerListener(mDrivingStateEventListener);
/* While we wait for a change to be notified, query the current state */
mDrivingStateEvent = mDrivingStateManager.getCurrentCarDrivingState();

private final CarDrivingStateManager.CarDrivingStateEventListener
mDrivingStateEventListener =
       new CarDrivingStateManager.CarDrivingStateEventListener() {
   @Override
   public void onDrivingStateChanged(CarDrivingStateEvent event) {
       mDrivingStateEvent = event;
       /* handle the state change accordingly */
       handleDrivingStateChange();
   }
};

الاختبار

يمكنك محاكاة عملية تغيير التروس والسرعة لتغيير حالة القيادة. استخدام واجهة ADB أوامر لحقن أحداث المركبة. يمكن أن يكون هذا تطويرًا واختبارًا مفيدًا.

لمحاكاة أحداث القيادة:

  1. لضبط السرعة على 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. لضبط رمز الترس على وضع إيقاف السيارة (لمحاكاة CarDriveStateEvent الذي يشير إلى PARKED):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. لضبط الترس على Drive، مع استمرار السرعة عند 0 (لمحاكاة توجيه CarDriveStateEvent إلى IDLING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
    
  4. لضبط السرعة على 30 مترًا في الثانية (لمحاكاة CarDriveStateEvent تشير إلى MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30