אפשר להשתמש בקלט מותאם אישית של יצרן ציוד מקורי (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.
כדי לוודא ש-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 OEM יכולים לגשת אל SystemApi ושיטות ציבוריות.
הטמעה לדוגמה
אפשר לראות את יישום ההפניה ב-packages/services/Car/tests/SampleCustomInputService, שמופיע כדוגמה וכקווים מנחים. לדוגמה, כדי להוסיף לחצן חדש בלחצני השליטה שעל ההגה. כשלוחצים על הכפתור החדש הזה, אפליקציית המפות מתחילה לפעול עם המיקום הנוכחי של הרכב.
בדוגמה הזו, יצרן הציוד המקורי בחר באפשרות INPUT_CODE_F1 (הפונקציה הראשונה CustomInputEvent
לנוחות השימוש) כדי לייצג את התכונה החדשה הזו (פתיחת אפליקציית המפות עם
המיקום הנוכחי של הרכב).
במהלך ההפעלה, השירות הזה נרשם ב-CarInputManager דרך requestInputEventCapture (אפשר לעיין בקוד הרישום של יישום ההפניה).
כשמתקבלים אירועי CustomInputEvent נכנסים, השירות הזה שולח את הכוונה להפעיל את אפליקציית המפות. כדי להבין איך זה קורה, אפשר לעיין ב-CustomInputEventListener.java.