שימוש בנתוני קלט מותאמים אישית של יצרן ציוד מקורי (OEM) כדי להוסיף אירועי קלט חדשים לרכב עבור תכונות חדשות ולא סטנדרטיות של Android. אירועי קלט לא סטנדרטיים לא ממופה על ידי KeyEvent
הקיים של Android, שנועד להיות כללי ולפעול בכל מכשיר Android, אבל לא הורחב כדי להטמיע תכונות ספציפיות ל-OEM. לדוגמה, לחצן שנמצא בלחצן ההיגוי, שלחיצה עליו פותחת אפליקציית מפות (דרך כוונה) עם המיקום הנוכחי של הרכב. התכונה הזו מאפשרת לנהגים לראות את המיקום הנוכחי שלהם בצורה חזותית בלי להסיח את דעתם בזמן הנהיגה.
במאמר הזה נסביר איך משתמשים מחדש ב-KeyEvent
קיים ב-Android כדי ליצור CustomInputEvent
לשימוש רק כשאי אפשר להשתמש ב-KeyEvent
ב-Android כדי לייצג את התכונה.
HW_CUSTOM_INPUT
קלט מותאם אישית של OEM מיוצג על ידי HW_CUSTOM_INPUT ו-CustomInputEvent.java. HW_CUSTOM_INPUT הוא האירוע המקורי שנוצר על ידי חומרת הרכב (Vehicle HAL). יצרני ציוד מקורי קובעים איך ליצור את האירוע הזה. הגישה ל-HW_CUSTOM_INPUT מוגדרת כ'קריאה בלבד', עם VehiclePropertyAccess:READ
.
כדי לוודא ש-HAL הרכב תמיד יכול לשדר את הערך העדכני ביותר שזמין, ההתראה HW_CUSTOM_INPUT מוגדרת כ-ON_CHANGE
, עם VehiclePropertyChangeMode:ON_CHANGE
.
הערכים של HW_CUSTOM_INPUT מורכבים מערך של int32
גנרי, שמוגדר כ-global. שלושת המספרים השלמים הכלליים הם:
הרכיב הראשון מייצג את קוד הקלט שיש להגדיר על ידי ה-OEM. אפשר לשייך לכל קוד קלט סמנטיקה.
הרכיב השני מאחסן את מסך היעד, כמו המסך הראשי או האשכולות.
הרכיב השלישי מכיל את מספר הפעמים שהאירוע חזר על עצמו. לדוגמה, כדי לציין כמה פעמים לחצן נלחץ.
CustomInputEvent ו-Car Input API
InputHalService הוא שירות הרכב שמקבל HW_CUSTOM_INPUT
נכנס מ-HAL של הרכב.
InputHalService ממירה את HW_CUSTOM_INPUT
הנכנס ל-CustomInputEvent
, כיתה של 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 Custom Input.
שירותי מערכת Android של יצרן ציוד מקורי
יצרני ציוד מקורי מספקים את שירות מערכת Android שלהם כדי לטפל ב-CustomInputEvents שמתקבלים מ-CarInputService
.
רק שירותים שמסומנים בהרשאת ההרשאה android.permission.INJECT_EVENTS יכולים להירשם ולקבל אירועי CustomInputEvents מ-Car Input API (CarInputManager). אי אפשר לחתום על אפליקציה או שירות של צד שלישי באמצעות ההרשאה הזו למערכת Android (רק שירותי OEM). לכן, אף שירות או אפליקציה של צד שלישי לא יכולים לרשום מול Car קלט API.
לשירותי המערכת של יצרני ציוד מקורי ל-Android יש גישה ל-SystemApi
ולשיטות ציבוריות.
הטמעת עזר
אפשר לעיין בהטמעת העזר ב-packages/services/Car/tests/SampleCustomInputService, שמוצגת כדוגמה וכהנחיה. לדוגמה, כדי להוסיף לחצן חדש לשליטה באמצעות ההגה. כשלוחצים על הלחצן, הלחצן החדש מפעיל את אפליקציית מפות Google במיקום הרכב הנוכחי.
בדוגמה זו, ה-OEM (יצרן הציוד המקורי) בחר ב-INPUT_CODE_F1
(פונקציית הנוחות CustomInputEvent
הראשונה) כדי לייצג את התכונה החדשה הזו (פתיחה של אפליקציית מפות Google עם מיקום הרכב הנוכחי).
במהלך ההפעלה, השירות הזה רושם את עצמו ב-CarInputManager
דרך requestInputEventCapture
(ראו קוד הרישום של ההטמעה לדוגמה).
כשמתקבלים אירועי CustomInputEvents נכנסים, השירות הזה שולח את הכוונה להפעלת אפליקציית המפות. כדי ללמוד איך זה מתבצע, אפשר לעיין בקוד CustomInputEventListener.java.