אפשר להשתמש בקלט מותאם אישית של יצרן ציוד מקורי (OEM) כדי להוסיף אירועי קלט חדשים לרכב עבור תכונות חדשות ולא סטנדרטיות של Android. אירועי קלט לא סטנדרטיים לא ממופים על ידי Android KeyEvent
הקיים, שמיועד להיות כללי ולפעול בכל ממשק של Android, אבל לא מורחב כדי ליישם תכונות ספציפיות ליצרן ציוד מקורי (OEM). לדוגמה, לחצן שנמצא על בקר ההגה, שכשלוחצים עליו נפתחת אפליקציית מפות (באמצעות intent) עם המיקום הנוכחי של הרכב. התכונה הזו מאפשרת לנהגים לראות את המיקום הנוכחי שלהם בלי להסיח את דעתם בזמן הנהיגה.
במאמר הזה מוסבר איך לעשות שימוש חוזר ב-KeyEvent
קיים ב-Android כדי ליצור CustomInputEvent
לשימוש רק כשאי אפשר להשתמש ב-KeyEvent
ב-Android כדי לייצג את התכונה.
HW_CUSTOM_INPUT
קלט מותאם אישית של OEM מיוצג על ידי HW_CUSTOM_INPUT ו-CustomInputEvent.java. HW_CUSTOM_INPUT הוא האירוע המקורי, שנוצר על ידי רכיבי החומרה של הרכב (Vehicle HAL). יצרני ציוד מקורי (OEM) קובעים איך ליצור מופע של האירוע הזה. הגישה אל HW_CUSTOM_INPUT מוגדרת כ[קריאה בלבד], עם VehiclePropertyAccess:READ
.
כדי לוודא ש-Vehicle HAL תמיד יכול לשדר את הערך הזמין האחרון, ההתראה HW_CUSTOM_INPUT מוגדרת כ-ON_CHANGE
, עם VehiclePropertyChangeMode:ON_CHANGE
.
הערכים של HW_CUSTOM_INPUT מורכבים ממערך של int32
כללי, שמוגדר כ-GLOBAL
(עם VehicleArea:GLOBAL
). שלושת המספרים השלמים הכלליים הם:
האלמנט הראשון מייצג את קוד הקלט שצריך להגדיר על ידי יצרן הציוד המקורי. אפשר לשייך כל סמנטיקה לקוד הקלט.
הרכיב השני מאחסן את התצוגה של היעד, כמו התצוגה הראשית או האשכול.
האלמנט השלישי מכיל את מספר הפעמים שהאירוע חזר על עצמו. לדוגמה, כדי לציין כמה פעמים נלחץ כפתור.
CustomInputEvent and Car Input API
InputHalService הוא שירות הרכב שמקבל HW_CUSTOM_INPUT
נכנס מ-Vehicle HAL.
InputHalService ממיר את HW_CUSTOM_INPUT
הנכנס ל-CustomInputEvent
, מחלקה של Java parcelable שנמצאת ב-car-lib/src/android/car/input, יחד עם ממשק ה-aidl המתאים.
CarInputService, שירות קלט ליבה לרכב, מקבל CustomInputEvents נכנסים ואז שולח אותם לכל שירות מערכת רשום של Android.
כדי לרשום ולקבל אירועי CustomInputEvent נכנסים, שירותי המערכת צריכים:
מטמיעים את CarInputManager.CarInputCaptureCallback#onKeyEvents.
נרשמים באמצעות CarInputManager#requestInputEventCapture, ומעבירים את
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
כפרמטר של סוג הקלט.כדי לבטל את הרישום, השירותים צריכים להפעיל את CarInputManager#releaseInputEventCapture.
בתרשים הבא מודגם תהליך העבודה של אירוע קלט בהתאמה אישית של יצרן ציוד מקורי.
שירותי מערכת Android של יצרן ציוד מקורי (OEM)
יצרני ציוד מקורי (OEM) מספקים את שירות מערכת Android שלהם כדי לטפל ב-CustomInputEvents שמגיעים מ-CarInputService
.
רק שירותים שמסומנים בהרשאת הפריבילגיה android.permission.INJECT_EVENTS יכולים להירשם ולקבל CustomInputEvents מממשק Car Input API (CarInputManager). אף אפליקציה או שירות של צד שלישי לא יכולים להיחתם באמצעות הרשאת מערכת Android הזו (רק שירותי OEM). לכן, אף אפליקציה או שירות של צד שלישי לא יכולים להירשם ל-Car Input API.
שירותי מערכת Android של יצרן ציוד מקורי יכולים לגשת אל SystemApi
ואל שיטות ציבוריות.
הטמעה לדוגמה
אפשר לראות את יישום ההפניה ב-packages/services/Car/tests/SampleCustomInputService, שמסופק כדוגמה וכקו מנחה. לדוגמה, כדי להוסיף לחצן חדש לבקרה של ההגה. כשלוחצים על הכפתור החדש הזה, אפליקציית המפות מתחילה לפעול עם המיקום הנוכחי של הרכב.
בדוגמה הזו, יצרן הציוד המקורי בחר באפשרות INPUT_CODE_F1
(הפונקציה הראשונה CustomInputEvent
לנוחות השימוש) כדי לייצג את התכונה החדשה הזו (פתיחת אפליקציית המפות עם
המיקום הנוכחי של הרכב).
במהלך ההפעלה, השירות הזה נרשם ב-CarInputManager
דרך requestInputEventCapture
(אפשר לעיין בקוד הרישום של יישום ההפניה).
כשמתקבלים אירועי CustomInputEvent נכנסים, השירות הזה שולח את הכוונה להפעיל את אפליקציית המפות. כדי להבין איך זה קורה, אפשר לעיין ב-CustomInputEventListener.java.