ใช้สถานะการขับขี่รถยนต์และข้อจำกัด UX

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

ผู้ชม

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

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

CarDrivingStateManager

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

CarDrivingStateEvent

ซึ่งให้ @SystemApis ซึ่งหมายความว่ามีเพียง Platform Internals, Bundled 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 ) Listener นี้ เมื่อลงทะเบียนกับ 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());

ข้อจำกัดของ CarUx

ออบเจ็กต์ CarUxRestrictions ให้ข้อมูลสองประเภท:

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

เมื่อได้รับ CarUxRestrictions จาก getCurrentUxRestrictions() หรือการเรียกกลับของผู้ฟัง ตอนนี้แอปจะสามารถใช้ isRequiresDistractionOptimization() API เพื่อพิจารณาว่าจำเป็นต้องมี Distraction Optimized หรือไม่ หากสิ่งนี้ส่งกลับ false ก็ไม่จำเป็นต้องมีการปรับให้เหมาะสมเพื่อเบี่ยงเบนความสนใจ และแอปสามารถดำเนินกิจกรรมใดๆ ได้อย่างปลอดภัย

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

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

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

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

รัฐขับรถ

CarDrivingStateManager นำเสนอสถานะการขับขี่ที่แท้จริงของยานพาหนะ (จอดอยู่ เดินเบา หรือกำลังเคลื่อนที่) CarDrivingStateManager API สามารถเรียกได้คล้ายกับ 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. วิธีตั้งค่าเกียร์เป็น Parked (เพื่อจำลอง 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