לצרוך מצב נהיגה ברכב והגבלות UX

דף זה מסביר כיצד אפליקציות יכולות לעבור בחן לממשקי משתמש מותאמים להסחת דעת (DO). הוא מתאר כיצד לצרוך את מצב הנהיגה של מכונית וכן את ההגבלות המתאימות על חווית המשתמש. למידע נוסף על הגבלות חווית משתמש ברכב (UX), ראה מגבלות חווית משתמש ברכב , המפרטת את שלושת מצבי הנהיגה של חנייה, סרק ותנועה.

קהל

תוכן זה מסופק למי שרוצה לעצב אפליקציות שמתאימות לשינויים במצב הנהיגה של המכונית ולהגבלות ה-UX המוטלות בהתאם.

פרטים טכניים

CarDrivingStateManager

מצב הנהיגה של מכונית (חניה, סרק או תנועה) נגזר מערכי החיישנים המסופקים על ידי שכבת חומרת הרכב (VHAL). מידע חיישן בסיסי, כגון מהירות הרכב ובחירת ההילוכים הנוכחית, משמש כדי לגזור את מצב הנהיגה הנוכחי של הרכב.

CarDrivingStateEvent .

אשר מספק את @SystemApis, כלומר רק פלטפורמות פנימיות, חבילות APK מצרפות (כגון SysUI או הגדרות), ו-APKs Privileged (כגון) GMSCore יכולים לגשת לממשקי ה-API. ממשקי ה-API מוגנים על ידי הרשאות ספציפיות למצב נהיגה android.car.permission.CAR_DRIVING_STATE . לקוחות הזקוקים לגישה למידע על מצב הנהיגה חייבים לבקש הרשאה זו.

CarUxRestrictionsManager

אפליקציות אלה שמציגות ממשק משתמש התלוי במצב הנהיגה חייבות להאזין ל- CarUxRestrictionsManager , אשר מפשט את המיפוי ממצב נהיגה להגבלות UX כך שאפליקציות לא יצטרכו להתאים לדרישות בטיחות שונות בשוק.

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

במקום זאת, אפליקציות עוקבות אחר הגבלות שנחשפות על ידי CarUxRestrictionsManager ולא מצב נהיגה מוחלט שנחשף על ידי CarDrivingStateManager עבור כל דבר הקשור לממשק המשתמש או לחוויית המשתמש.

דוגמה לקוד

הקוד לדוגמה הבא ממחיש כיצד אפליקציה עוקבת אחר הגבלות UX:

  1. ייבא את חבילות ספריית הרכב:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. הטמע CarUxRestrictionManager.OnUxRestrictionsChangedListener ( mUxRChangeListener ). מאזין זה, כאשר הוא רשום ב- CarUxRestrictionsManager , נקרא כאשר מתרחש שינוי בהגבלות ה-UX. טפל בשינויי ההגבלה כדי להיות אופטימליים של הסחת דעת, לפי הצורך:
    @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. התקשר לממשקי ה-API של המכונית כדי ליצור מופע רכב בשם 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 כדי להשיג את ערכת ההגבלות. ממשק API זה מחזיר int , שהוא מעט מסכה של כל ההגבלות הקיימות כעת. קבוצת ההגבלות המוענקת כעת רשומה תחת CarUxRestrictions .

הערה: שינויים קלים במערך ההגבלות צפויים להתרחש בעתיד הקרוב.

לדוגמה, אם אפליקציה רוצה לקבוע אם קיימת הגבלה להפעלת וידאו, לאחר קבלת האובייקט CarUxRestrictions, האפליקציה חייבת לבדוק את ההגבלה:

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

DrivingState

CarDrivingStateManager מציג את מצב הנהיגה בפועל של הרכב (חניה, סרק או נע). ניתן לקרוא ממשקי API של 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 להזרקת אירועי רכב. זה יכול להיות שימושי בפיתוח ובדיקה.

כדי לדמות אירועי נהיגה:

  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 המצביע על MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30