หน้านี้อธิบายว่าแอปสามารถเปลี่ยนไปใช้อินเทอร์เฟซผู้ใช้ที่ปรับการรบกวนสมาธิ (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 อย่างไร:
- นำเข้าแพ็คเกจห้องสมุดรถยนต์:
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
- ใช้
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); } };
- เรียก 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) ส่งผลให้ผู้ฟังได้รับการเปลี่ยนแปลงข้อจำกัดเมื่อสถานะของไดรฟ์เปลี่ยนแปลง:
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 ให้ข้อมูลสองประเภท:
- มีข้อกำหนดในปัจจุบันที่ต้องเพิ่มประสิทธิภาพการรบกวนสมาธิหรือไม่?
- หากเป็นเช่นนั้น ปัจจุบันมีข้อจำกัดอะไรบ้าง?
เมื่อได้รับ 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 เพื่อแทรกเหตุการณ์ของยานพาหนะ นี่อาจเป็นการพัฒนาและการทดสอบที่มีประโยชน์
เพื่อจำลองเหตุการณ์การขับขี่:
- วิธีตั้งค่าความเร็วเป็น 0:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- วิธีตั้งค่าเกียร์เป็น Parked (เพื่อจำลอง CarDrivingStateEvent ชี้ไปที่ PARKED):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
- วิธีตั้งค่าเกียร์เป็น Drive โดยที่ความเร็วยังคงอยู่ที่ 0 (เพื่อจำลอง CarDrivingStateEvent ชี้ไปที่ IDLING):
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