تستهلك حالة قيادة السيارة وقيود UX

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

جمهور

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

تفاصيل تقنية

CarDrivingStateManager

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

CarDrivingStateEvent .

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

CarUxRestrictionsManager

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

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

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

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

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

  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 أعلاه باستخدام استدعاء CarUxRestrictionsManager mCarUxRestrictionsManager.registerListener() :
    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 لتحديد ما إذا كان Distraction Optimized مطلوبًا أم لا. إذا أدى هذا إلى إرجاع false ، فليست هناك حاجة إلى تحسين التشتيت ويمكن للتطبيق تشغيل أي نشاط بأمان.

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

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

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

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

حالة القيادة

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

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 shell لإدخال أحداث المركبة. يمكن أن يكون هذا تطويرًا واختبارًا مفيدًا.

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

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