ใช้สถานะการขับขี่ของรถและข้อจํากัด UX

หน้านี้อธิบายวิธีที่แอปสามารถเปลี่ยนเป็นอินเทอร์เฟซผู้ใช้ที่ลดความซับซ้อน (DO) ได้อย่างราบรื่น ซึ่งจะอธิบายวิธีใช้สถานะการขับขี่ของรถยนต์ รวมถึงข้อจำกัดด้านประสบการณ์ของผู้ใช้ที่เกี่ยวข้อง ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อจำกัดด้านประสบการณ์ของผู้ใช้ (UX) ของรถยนต์ได้ที่ข้อจำกัดด้านประสบการณ์ของผู้ใช้ (UX) ของรถยนต์ ซึ่งจะอธิบายสถานะการขับขี่ 3 สถานะ ได้แก่ จอดอยู่กับที่ เดินเบา และเคลื่อนที่

ผู้ชม

เนื้อหานี้มีไว้สำหรับผู้ที่ต้องการออกแบบแอปที่ปรับตามการเปลี่ยนแปลงสถานะการขับขี่ของรถยนต์และข้อจำกัด UX ที่เกี่ยวข้อง

รายละเอียดทางเทคนิค

CarDrivingStateManager

สถานะการขับขี่ของรถยนต์ (จอด เดินเบา หรือเคลื่อนที่) มาจากค่าเซ็นเซอร์ที่ได้จากเลเยอร์การแยกแยะฮาร์ดแวร์ของยานพาหนะ (VHAL) ระบบจะใช้ข้อมูลเซ็นเซอร์พื้นฐาน เช่น ความเร็วของรถและเกียร์ที่ใช้อยู่ในปัจจุบัน เพื่อหาสถานะการขับขี่ปัจจุบันของรถ

CarDrivingStateEvent

ซึ่งให้บริการ @SystemApis ซึ่งหมายความว่ามีเพียงแพลตฟอร์มภายใน, APK ที่รวมไว้ (เช่น SysUI หรือการตั้งค่า) และ APK ที่มีสิทธิ์ (เช่น) 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 แล้ว ระบบจะเรียกใช้ Listener นี้เมื่อมีการเปลี่ยนแปลงข้อจำกัด 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. เรียกใช้ Car 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

ออบเจ็กต์ CarUxRestrictions มีข้อมูล 2 ประเภท ได้แก่

  1. ปัจจุบันมีข้อกำหนดในการเพิ่มประสิทธิภาพเพื่อลดสิ่งรบกวนไหม
  2. หากใช่ ขณะนี้มีข้อจํากัดใดบ้าง

เมื่อได้รับ CarUxRestrictions จาก getCurrentUxRestrictions() หรือฟังก์ชันการเรียกกลับของโปรแกรมฟัง ตอนนี้แอปจะใช้ isRequiresDistractionOptimization() API เพื่อระบุว่าจำเป็นต้องใช้ Distraction optimized หรือไม่ หากผลลัพธ์คือ false แสดงว่าไม่จำเป็นต้องมีการจัดการเพื่อลดสิ่งรบกวน (Distraction Minimization) และแอปจะทำงานอย่างปลอดภัยได้

หากต้องการเพิ่มประสิทธิภาพ ให้ใช้ API getActiveRestrictions() เพื่อดูชุดข้อจํากัดที่มี API นี้จะแสดงผล int ซึ่งเป็นบิตมาสก์ของข้อจํากัดทั้งหมดที่มีผลอยู่ในปัจจุบัน รายการข้อจำกัดที่แจ้งในปัจจุบันจะแสดงอยู่ในส่วน CarUxRestrictions

หมายเหตุ: เราคาดว่าจะมีการเปลี่ยนแปลงเล็กน้อยในชุดข้อจำกัดนี้ในอนาคตอันใกล้

ตัวอย่างเช่น หากแอปต้องการระบุว่ามีข้อจํากัดในการเล่นวิดีโอหรือไม่ เมื่อได้รับออบเจ็กต์ CarUxRestrictions แอปต้องตรวจสอบข้อจํากัด ดังนี้

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

DrivingState

CarDrivingStateManager แสดงสถานะการขับขี่จริงของยานพาหนะ (จอดอยู่ เดินเบา หรือเคลื่อนที่) API ของ CarDrivingStateManager สามารถเรียกใช้ได้คล้ายกับ CarUxRestrictionsManager แอปสามารถลงทะเบียน Listener หรือรับสถานะการขับขี่ปัจจุบันได้ ระบบจะแสดงสถานะการขับรถเป็น 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