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

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

קהל

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

פרטים טכניים

CarDrivingStateManager

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

CarDrivingStateEvent .

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

CarUxRestrictionsManager

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

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

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

אם נדרשת אופטימיזציה, השתמש ב- 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