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

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

ผู้ชม

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

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

เครื่องมือจัดการสถานะการขับรถ

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

CarDrivingStateEvent

ซึ่งจะมี @SystemApis ซึ่งหมายความว่าจะมีเฉพาะ Platform Internals, APK แบบแพ็กเกจ (เช่น SysUI หรือ การตั้งค่า) และ APK ที่ได้รับสิทธิ์ (เช่น) GMSCore จะเข้าถึง API ได้ API ได้รับการปกป้องโดย สิทธิ์เฉพาะสำหรับสถานะการขับรถ android.car.permission.CAR_DRIVING_STATE ลูกค้า ที่ต้องการเข้าถึงข้อมูลสถานะการขับรถต้องขอสิทธิ์นี้

เครื่องมือจัดการข้อจำกัด CarUx

แอปที่แสดงอินเทอร์เฟซผู้ใช้ตามสถานะการขับรถจะต้องฟัง CarUxRestrictionsManager, ซึ่งสรุปการแมปจากสถานะขับเคลื่อนเป็นข้อจำกัด UX แอปจะได้ไม่ต้อง ปรับให้เข้ากับข้อกำหนดด้านความปลอดภัยของตลาดนั้นๆ

หมายเหตุ: กิจกรรมเหล่านี้ต้องทำเครื่องหมายเป็น เพิ่มประสิทธิภาพสิ่งรบกวนสมาธิ ตามที่อธิบายไว้ ในคำแนะนำเกี่ยวกับการรบกวนผู้ขับขี่ หากไม่มีการทำเครื่องหมายกิจกรรมไว้ ระบบจะบล็อกกิจกรรมนั้น

แต่แอปจะตรวจสอบข้อจำกัดที่ CarUxRestrictionsManager พบและไม่ใช่ สถานะการขับขี่สัมบูรณ์ที่ CarDriveStateManager เปิดเผยสำหรับทุกอย่างที่เกี่ยวข้องกับผู้ใช้ หรือประสบการณ์ของผู้ใช้

ตัวอย่างโค้ด

โค้ดตัวอย่างต่อไปนี้แสดงวิธีที่แอปตรวจสอบข้อจำกัด 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) ส่งผลให้ 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());

ข้อจำกัด CarUx

ออบเจ็กต์ CarUxRestrictions มีข้อมูล 2 ประเภทดังนี้

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

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

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

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

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

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

สถานะการขับรถ

CarDriveStateManager แสดงสถานะการขับขี่ตามจริงของรถ (จอดอยู่ ไม่มีการใช้งาน หรือ กำลังย้าย) สามารถเรียก API ของ Carการควบคุม StateManager ได้ในลักษณะเดียวกับ CarUxRestrictionsManager แอปสามารถลงทะเบียนผู้ฟังหรือดูสถานะการขับรถปัจจุบันได้ ระบบจะแสดงผลสถานะการขับรถ เป็น CarRunningStateEvent

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. วิธีตั้งค่าเกียร์เป็น "จอดรถ" (เพื่อจำลอง Car driveStateEvent ให้ชี้ไปที่ PARKED)
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. ตั้งค่าเกียร์ไปที่ไดรฟ์โดยให้ความเร็วยังคงเป็น 0 (เพื่อจำลองการชี้ Car driveStateEvent เป็น IDLING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
    
  4. หากต้องการตั้งค่าความเร็วเป็น 30 เมตรต่อวินาที (เพื่อจำลอง CarHourStateEvent ให้ชี้ไปที่ MOVING)
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30