ใช้อินพุตที่กำหนดเองของ OEM เพื่อเพิ่มเหตุการณ์อินพุตรถยนต์ใหม่สำหรับฟีเจอร์ Android ใหม่และที่ไม่ใช่มาตรฐาน Android KeyEvent
ที่มีอยู่ไม่ได้แมปเหตุการณ์อินพุตที่ไม่ใช่มาตรฐาน เนื่องจากออกแบบมาให้เป็นแบบทั่วไปและใช้งานได้กับแพลตฟอร์ม Android ทุกรุ่น แต่ไม่ได้ขยายการให้บริการเพื่อใช้ฟีเจอร์เฉพาะของ OEM ตัวอย่างเช่น ปุ่ม
ที่อยู่บนตัวควบคุมพวงมาลัย ซึ่งเมื่อกดจะเป็นการเปิดแอปแผนที่
(ผ่านความตั้งใจ) ที่มีตำแหน่งปัจจุบันของรถ ฟีเจอร์นี้ช่วยให้ผู้ขับขี่เห็นภาพตำแหน่งปัจจุบันของตนได้โดยไม่ต้องเสียสมาธิขณะขับรถ
บทความนี้อธิบายวิธีนํา KeyEvent
ของ Android ที่มีอยู่มาใช้ซ้ำเพื่อสร้าง CustomInputEvent
เพื่อใช้เฉพาะในกรณีที่ใช้ KeyEvent
ของ Android เพื่อแสดงฟีเจอร์ไม่ได้
HW_CUSTOM_INPUT
อินพุตที่กำหนดเองของ OEM จะแสดงด้วย HW_CUSTOM_INPUT และ CustomInputEvent.java HW_CUSTOM_INPUT คือเหตุการณ์เนทีฟที่สร้างขึ้นโดยฮาร์ดแวร์ของรถยนต์ (HAL ยานพาหนะ) OEM จะเป็นผู้กำหนดวิธีสร้างอินสแตนซ์เหตุการณ์นี้ การเข้าถึง HW_CUSTOM_INPUT มีการตั้งค่าเป็น [อ่านอย่างเดียว] ด้วย VehiclePropertyAccess:READ
เพื่อให้ HAL ของยานพาหนะเผยแพร่ค่าล่าสุดที่มีได้เสมอ ระบบจะตั้งค่าการแจ้งเตือนHW_CUSTOM_INPUT เป็น ON_CHANGE
พร้อมด้วย
VehiclePropertyChangeMode:ON_CHANGE
ค่า HW_CUSTOM_INPUT ประกอบด้วยอาร์เรย์ของ int32
ทั่วไปที่ตั้งค่าเป็น global จำนวนเต็มทั่วไป 3 รายการ ได้แก่
องค์ประกอบแรกแสดงถึงรหัสอินพุตที่ OEM จะกําหนด คุณสามารถเชื่อมโยงความหมายใดก็ได้กับโค้ดอินพุต
องค์ประกอบที่ 2 จะจัดเก็บจอแสดงผลเป้าหมาย เช่น จอแสดงผลหรือคลัสเตอร์หลัก
องค์ประกอบที่ 3 ประกอบด้วยจำนวนครั้งที่เหตุการณ์เกิดซ้ำ เช่น เพื่อระบุจํานวนครั้งที่มีการกดปุ่ม
CustomInputEvent และ Car Input API
InputHalService คือบริการรถยนต์ที่รับ HW_CUSTOM_INPUT
จาก HAL ของยานพาหนะ
InputHalService จะแปลง HW_CUSTOM_INPUT
ที่เข้ามาเป็น CustomInputEvent
ซึ่งเป็นคลาส Parcelable ของ Java ที่อยู่ใน car-lib/src/android/car/input พร้อมกับอินเทอร์เฟซ AIDL ที่เกี่ยวข้อง
CarInputService ซึ่งเป็นบริการป้อนข้อมูลหลักของรถยนต์จะรับเหตุการณ์ CustomInputEvents ที่เข้ามาใหม่และส่งไปยังบริการระบบ Android ที่ลงทะเบียนทั้งหมด
หากต้องการลงทะเบียนและรับ CustomInputEvents ที่เข้ามา บริการของระบบต้องทำดังนี้
ติดตั้งใช้งาน CarInputManager.CarInputCaptureCallback#onKeyEvents
ลงทะเบียนผ่าน CarInputManager#requestInputEventCapture โดยส่ง
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
เป็นพารามิเตอร์ประเภทอินพุตหากต้องการยกเลิกการลงทะเบียน บริการต้องเรียกใช้ CarInputManager#releaseInputEventCapture
แผนภาพต่อไปนี้แสดงเวิร์กโฟลว์ของเหตุการณ์อินพุตที่กําหนดเองของ OEM
บริการระบบ Android ของ OEM
OEM ให้บริการระบบ Android เพื่อจัดการ CustomInputEvents ที่เข้ามาจาก CarInputService
เฉพาะบริการที่มีการทำเครื่องหมายด้วยสิทธิ์android.permission.INJECT_EVENTS เท่านั้นที่ลงทะเบียนและรับ CustomInputEvents จาก Car Input API ได้ (CarInputManager) บริการหรือแอปพลิเคชันของบุคคลที่สามไม่สามารถลงนามด้วยสิทธิ์ของระบบ Android นี้ได้ (เฉพาะบริการ OEM เท่านั้น) ดังนั้น บริการหรือแอปพลิเคชันของบุคคลที่สามจึงไม่สามารถลงทะเบียนกับ Car Input API ได้
บริการของระบบ Android ของ OEM สามารถเข้าถึง SystemApi
และเมธอดสาธารณะได้
การใช้งานอ้างอิง
ดูการใช้งานอ้างอิงใน packages/services/Car/tests/SampleCustomInputService ซึ่งให้ไว้เป็นตัวอย่างและหลักเกณฑ์ เช่น การเพิ่มปุ่มใหม่ในการควบคุมด้วยพวงมาลัย เมื่อกดปุ่มใหม่นี้ แอป Maps จะเริ่มต้นขึ้นพร้อมตำแหน่งปัจจุบันของรถ
ในตัวอย่างนี้ OEM เลือก INPUT_CODE_F1
(ฟังก์ชันอำนวยความสะดวกของ CustomInputEvent
รายการแรก) เพื่อแสดงฟีเจอร์ใหม่นี้ (การเปิดแอปแผนที่ด้วยตำแหน่งของรถปัจจุบัน)
ในระหว่างการเริ่มต้นระบบ บริการนี้จะลงทะเบียนกับ CarInputManager
ผ่าน requestInputEventCapture
(ดูรหัสการลงทะเบียนการใช้งานอ้างอิง
เมื่อได้รับ CustomInputEvents ขาเข้า บริการนี้จะส่ง Intent เพื่อเริ่มแอป Maps ดูวิธีดำเนินการได้ที่ CustomInputEventListener.java