ใช้อินพุตที่กำหนดเองของ OEM เพื่อเพิ่มเหตุการณ์อินพุตรถยนต์ใหม่สำหรับฟีเจอร์ Android ใหม่และที่ไม่ใช่มาตรฐาน Android KeyEvent
ที่มีอยู่ไม่ได้แมปเหตุการณ์อินพุตที่ไม่ใช่มาตรฐาน เนื่องจากออกแบบมาให้เป็นแบบทั่วไปและใช้งานได้กับแพลตฟอร์ม Android ทั้งหมด แต่ไม่ได้ขยายการให้บริการเพื่อใช้ฟีเจอร์เฉพาะของ OEM เช่น ปุ่มที่อยู่บนตัวควบคุมพวงมาลัย ซึ่งเมื่อกดแล้ว ระบบจะเปิดแอปแผนที่ (ผ่าน Intent) พร้อมตำแหน่งปัจจุบันของรถ ฟีเจอร์นี้ช่วยให้ผู้ขับขี่เห็นภาพตำแหน่งปัจจุบันของตนได้โดยไม่ต้องเสียสมาธิขณะขับรถ
บทความนี้อธิบายวิธีนํา KeyEvent
ของ Android ที่มีอยู่มาใช้ซ้ำเพื่อสร้าง CustomInputEvent
เพื่อใช้เฉพาะในกรณีที่ใช้ KeyEvent
ของ Android เพื่อแสดงฟีเจอร์ไม่ได้
HW_CUSTOM_INPUT
อินพุตที่กำหนดเองของ OEM จะแสดงด้วย HW_CUSTOM_INPUT และ CustomInputEvent.java HW_CUSTOM_INPUT คือเหตุการณ์แบบเนทีฟที่สร้างขึ้นโดยฮาร์ดแวร์ของรถยนต์ (HAL ยานพาหนะ) OEM จะเป็นผู้กำหนดวิธีสร้างอินสแตนซ์เหตุการณ์นี้ สิทธิ์เข้าถึง HW_CUSTOM_INPUT ได้รับการตั้งค่าเป็น [อ่านอย่างเดียว] ด้วย VehiclePropertyAccess:READ
ระบบจะตั้งค่าการแจ้งเตือน HW_CUSTOM_INPUT เป็น ON_CHANGE
พร้อม VehiclePropertyChangeMode:ON_CHANGE
เพื่อให้ HAL ของยานพาหนะสามารถออกอากาศค่าล่าสุดที่ใช้ได้เสมอ
ค่า 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 ซึ่งเป็นบริการหลักของ Car Input จะรับ CustomInputEvents ที่เข้ามา แล้วส่งไปยังบริการระบบ Android ที่ลงทะเบียนไว้
บริการของระบบต้องมีคุณสมบัติดังนี้จึงจะลงทะเบียนและรับ CustomInputEvents ที่เข้ามา
ลงทะเบียนผ่าน 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