หน้านี้อธิบายวิธีที่แอปสามารถเปลี่ยนเป็นอินเทอร์เฟซผู้ใช้ที่ลดความซับซ้อน (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
- นําเข้าแพ็กเกจคลังภาพรถยนต์
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
- ใช้
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); } };
- เรียกใช้ Car API เพื่อสร้างอินสแตนซ์รถชื่อ mCar และเชื่อมต่อกับบริการรถยนต์
mCar = Car.createCar(context); if (mCar == null) { // handle car connection error }
- โทรหา
mCar.getCarManager() - mCarUxRestrictionsManager
เพื่อรับCarUxRestrictionsManager
CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
- วิธีลงทะเบียน
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 ประเภท ได้แก่
- ปัจจุบันมีข้อกำหนดในการเพิ่มประสิทธิภาพเพื่อลดสิ่งรบกวนไหม
- หากใช่ ขณะนี้มีข้อจํากัดใดบ้าง
เมื่อได้รับ 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 เพื่อแทรกเหตุการณ์ยานพาหนะ ซึ่งอาจเป็นประโยชน์ต่อการพัฒนาและการทดสอบ
วิธีจําลองเหตุการณ์การขับรถ
- วิธีตั้งค่าความเร็วเป็น 0
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- วิธีตั้งค่าเกียร์เป็น "เข้าเกียร์จอด" (เพื่อจำลอง CarDrivingStateEvent ที่ชี้ไปที่ "เข้าเกียร์จอด")
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
- วิธีตั้งค่าเกียร์เป็น "ขับ" โดยที่ความเร็วยังคงอยู่ที่ 0 (เพื่อจำลอง CarDrivingStateEvent ที่ชี้ไปที่ "เดินเบา")
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
- วิธีตั้งค่าความเร็วเป็น 30 เมตรต่อวินาที (เพื่อจำลอง CarDrivingStateEvent ที่ชี้ไปที่ MOVING)
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30