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

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

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

השירות Car UX Restrictions מאפשר למפתחים להגדיר הגדרה חדשה של Car UX Restrictions. אם מפתח רוצה לשנות את כללי ההגבלה (למשל כדי לעמוד בתקני בטיחות מקומיים), הוא יכול להשתמש ב-API כדי להגדיר את ההגדרה החדשה.

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

בנוסף לשיטה החדשה של שירות הגבלות חוויית המשתמש, יש גם ממשקי API שמאפשרים ליצור את ההגדרה. מצב בחירת ההילוך והמהירות מומר לאחד משלושת מצבי הנהיגה הבאים:

  • בהמתנה. ההילוך במצב חנייה.
  • מצב המתנה. ההילוך לא במצב חנייה והמהירות היא אפס.
  • העברה. ההילוך לא במצב חנייה והמהירות לא אפס.

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

הגדרת הגבלות על סמך מצבי Drive

כדי למנוע הסחת דעת של הנהג, מערכת Android ממפה את מצב הנהיגה לקבוצה של הגבלות על חוויית המשתמש /packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

  • בהמתנה. ללא הגבלה.
  • מצב המתנה. אין סרטון ואין מסך הגדרה.
  • העברה. מוגבל באופן מלא (כל ההגבלות נדרשות).

המיפוי שמוצג למעלה נקבע מראש ומוגדר כמשאב XML. ה-/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java שומר את הכללים בזיכרון. לאחר מכן, השירות ממפה את מצב הנהיגה הנוכחי להגבלות על חוויית המשתמש ומשדר את ההגבלות הנוכחיות לכל המערכת.

<!-- No restrictions when car is parked -->
<DrivingState car:state="parked">
    <Restrictions car:requiresDistractionOptimization="false"
                  car:uxr="baseline"/>
</DrivingState>

<!-- Restrictions when car is idling -->
<DrivingState car:state="idling">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="no_video|no_config"/>
</DrivingState>

<!-- Restrictions for speed >= 0 m/s -->
<DrivingState car:state="moving" car:minSpeed="0.0">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="fully_restricted"/>
</DrivingState>

הגדרות לתצוגה מרובת מסכים

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

<RestrictionMapping car:physicalPort="1">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_keyboard|no_video"/>
       </DrivingState>
   </RestrictionMapping>

   <RestrictionMapping car:physicalPort="2">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
       </DrivingState>
  </RestrictionMapping>

הגדרות של מצבי הגבלה

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

<DrivingState car:state="idling">
    <Restrictions car:mode="passenger" car:requiresDistractionOptimization="false" car:uxr="baseline"/>
    <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
</DrivingState>
</Restrictions>
אפשר להשתמש ב-API כדי להגדיר שם מחרוזת כלשהו למצב. לדוגמה, השיטה setRestrictionMode(@NonNull String mode) ב-CarUxRestrictionsManager. (בעבר, הייתם משתמשים בשיטה setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode) ב-CarUxRestrictionsManager).

CarUxRestrictionsConfiguration APIs

הגבלות באמצעות CarUxRestrictionsConfiguration

הכיתה החדשה CarUxRestrictionsConfiguration ממופה 1:1 לסכימת ההגדרות הנוכחית של XML. אפשר ליצור את CarUxRestrictionsConfiguration באמצעות CarUxRestrictions.Builder, שמאמת את ההגדרה כשמריצים את build().

new CarUxRestrictionsConfiguration.Builder()
        // Explicitly set restrictions for each driving state.
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED,
                /* requiresOptimization= */ false,
                /* restrictions= */ UX_RESTRICTIONS_BASELINE)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_IDLING,
                true,
                UX_RESTRICTIONS_NO_VIDEO|UX_RESTRICTIONS_NO_SETUP)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_MOVING,
                true,
                UX_RESTRICTIONS_FULLY_RESTRICTED)
        // Set restriction parameters.
        .setMaxStringLength(int max)
        .setMaxCumulativeContentItems(int max)
        .setMaxContentDepth(int max)
        // Build a new CarUxRestrictionsConfiguration.
        .build();

CarUxRestrictionsManager API

מגדירים את CarUxRestrictionsConfiguration לכונן הבא באמצעות CarUxRestrictionsManager. לשיטה הזו נדרשת הרשאה, Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION.

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

שמירת הגדרה חדשה של הגבלות על חוויית משתמש

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

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

תצורת ייצור

איור 1. תצורת ייצור

בעיות שקשורות לכתובת

הגבלות חוויית המשתמש לא ייאכפו עד שיתקבל מידע על מצב הנהיגה מ-CarPropertyManager (לדוגמה, במהלך האתחול). המערכת פועלת כאילו מצב הנהיגה הוא חניה.

אם קריאת ההגדרה השמורה נכשלת (לדוגמה, אם מתקבלת תוצאה של SettingNotFoundException), שירות ההגבלות על חוויית המשתמש חוזר למצב המקודד הקשיח והמוגבל לחלוטין:

// Idling/moving state is fully restricted.
private static CarUxRestrictionsConfiguration generateDefaultConfig() {}

מצב הנהיגה והגבלות המשתמש

בתוכן הבא מתוארות האינטראקציות שמוצגות בתרשים העיצוב הבא:

אינטראקציות במצב נהיגה

איור 2. אינטראקציות במצב נהיגה

מאפיינים שמשמשים להסקת מצב הנהיגה

כדי לגזור את מצב הנהיגה, משתמשים בשלושת VehiclePropertyIds הבאים:

ממשקי API שזמינים לאפליקציות

הקוד נמצא במיקומים הבאים:

קוד מיקום
CarUxRestrictionsManager
ממשקי API ציבוריים שצריך לרשום כדי לקבל שינויים בהגבלות על חוויית המשתמש.
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarUxRestrictions
הגדרה של הגבלות על חוויית המשתמש.
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarDrivingStateManager
ממשקי מערכת לרישום לשינויים במצב הנהיגה.
/packages/services/Car/+/android16-qpr1-release/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

מידע על סימולציה של מצבי נהיגה זמין במאמר בנושא בדיקה.