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

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

קהל

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

פרטים טכניים

מנהל המכונית

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

CarDrivingStateEvent.

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

CarUxRestrictionsManager

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

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

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

דוגמת קוד

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

  1. מייבאים את החבילות של ספריית הרכב:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
  2. יישום של CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener). ה-listener הזה, כשהוא רשום מתבצעת קריאה ל-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 שלמעלה עם CarUxRestrictionsManager התקשרות אל mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

הבלוק שהושלם של קוד לדוגמה (שנוצר בשלבים 3 עד שלב 5) מוביל ל-listener הגבלות שהתקבלו כשמצב האחסון משתנה:

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 מספק שני סוגי מידע:

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

כשמתקבלים CarUxRestrictions (הגבלות) אחד getCurrentUxRestrictions() או הקריאה החוזרת (callback) של ה-listener, אפליקציות יכולות להשתמש עכשיו את ה-API של isRequiresDistractionOptimization() כדי לקבוע אם יש הסחות דעת בוצעה אופטימיזציה הוא שדה חובה. אם הפונקציה מחזירה את הערך false, אין דרישה להסחות דעת. האפליקציה עברה אופטימיזציה והאפליקציה יכולה להריץ כל פעילות בצורה בטוחה.

אם נדרשת אופטימיזציה, משתמשים ב-API getActiveRestrictions() כדי להגדיר את קבוצת ההגבלות. הזה ה-API מחזיר פרמטר int, שהוא מעט אנונימיזציה של כל ההגבלות שחלות כרגע. קבוצת ההגבלות המדווחות נמצאת כרגע בקטע CarUxRestrictions.

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

לדוגמה, אם אפליקציה רוצה לקבוע אם קיימת הגבלה להפעלת סרטון, כשמקבלים את האובייקט CarUxRestrictions, צריך לבדוק אם קיימת הגבלה באפליקציה:

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

מצב נהיגה

CardriveStateManager מציג את מצב הנהיגה בפועל של הרכב (במצב 'בחנייה', 'לא פעיל' או ' מעבר). ניתן לקרוא לממשקי ה-API של CardriveStateManager באופן דומה ל-CarUxRestrictionsManager. אפליקציות יכולות לרשום מאזינים או לקבל מידע על מצב הנהיגה הנוכחי. מצב הנהיגה מוחזר בתור CardriveStateEvent.

CarDrivingStateEvent.

שונים, קוראים ל-method 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. כדי להעביר את גלגל השיניים למצב 'חניה' (כדי לדמות את Car progressStateEvent שמצביע אל 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