שימוש במצב הנהיגה ברכב ובהגבלות על חוויית המשתמש

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

קהל

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

פרטים טכניים

CarDrivingStateManager

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

CarDrivingStateEvent.

שמספק את @SystemApis, כלומר רק רכיבים פנימיים של פלטפורמה, חבילות APK (כמו SysUI או הגדרות) ו-APK עם הרשאות (כמו GMSCore) יכולים לגשת לממשקי ה-API. ממשקי ה-API מוגנים באמצעות הרשאות ספציפיות למצב הנסיעה 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. קוראים לממשקי ה-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 למעלה באמצעות קריאה ל-CarUxRestrictionsManagermCarUxRestrictionsManager.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 כדי לקבוע אם יש צורך בהפעלת התכונה 'אופטימיזציה להפחתת הסחות דעת'. אם הפונקציה מחזירה את הערך false, אין צורך לבצע אופטימיזציה למניעת הסחות דעת, והאפליקציה יכולה להריץ בבטחה כל פעילות.

אם נדרשת אופטימיזציה, צריך להשתמש ב-API getActiveRestrictions()‎ כדי לקבל את קבוצת ההגבלות הקיימות. ממשק ה-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 שמצביע על 'חניה'):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
  3. כדי להעביר את ההילוך ל'דחיפת רגל על דווש הברקס', כשהמהירות עדיין 0 (כדי לדמות את האירוע CarDrivingStateEvent שמצביע על 'המתנה'):
    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