از ورودیهای سفارشی OEM برای اضافه کردن رویدادهای ورودی جدید Car برای ویژگیهای جدید و غیراستاندارد اندروید استفاده کنید. رویدادهای ورودی غیراستاندارد توسط KeyEvent موجود Android نگاشت نمیشوند، که به صورت عمومی طراحی شده و برای کار بر روی هر سطح Android طراحی شده است اما برای پیادهسازی ویژگیهای خاص OEM توسعه نیافته است. به عنوان مثال، دکمهای که روی کنترل فرمان قرار دارد و با فشردن آن، یک برنامه نقشه (از طریق یک intent) با مکان فعلی خودرو باز میشود. این ویژگی به رانندگان این امکان را میدهد که مکان فعلی خود را بدون حواسپرتی هنگام رانندگی تجسم کنند.
این مقاله نحوه استفاده مجدد از یک KeyEvent موجود در اندروید را برای ایجاد یک CustomInputEvent برای استفاده فقط در زمانی که هیچ KeyEvent اندروید برای نمایش ویژگی قابل استفاده نیست، شرح میدهد.
ورودی سفارشی HW
یک ورودی سفارشی 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 ) تنظیم شدهاند. سه عدد صحیح عمومی عبارتند از:
عنصر اول نشان دهنده کد ورودی است که توسط OEM تعریف میشود. شما میتوانید هر معنایی را به کد ورودی مرتبط کنید.
عنصر دوم نمایشگر هدف، مانند نمایشگر اصلی یا خوشه، را ذخیره میکند.
عنصر سوم شامل تعداد دفعات تکرار رویداد است. به عنوان مثال، برای نشان دادن تعداد دفعات فشار دادن یک دکمه.
API مربوط به CustomInputEvent و Car Input
InputHalService سرویس Car است که HW_CUSTOM_INPUT ورودی را از Vehicle HAL دریافت میکند.
InputHalService ورودی HW_CUSTOM_INPUT را به CustomInputEvent ، یک کلاس parcelable جاوا که در car-lib/src/android/car/input قرار دارد، به همراه رابط aidl مربوطه تبدیل میکند.
CarInputService ، یک سرویس ورودی اصلی Car، رویدادهای ورودی CustomInputEvents را دریافت کرده و سپس آنها را به هر سرویس سیستم اندروید ثبت شده ارسال میکند.
برای ثبت و دریافت CustomInputEventهای ورودی، سرویسهای سیستم باید:
CarInputManager.CarInputCaptureCallback#onKeyEvents را پیادهسازی کنید.
از طریق CarInputManager#requestInputEventCapture ثبت کنید و
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENTبه عنوان پارامتر نوع ورودی ارسال کنید.برای لغو ثبت، سرویسها باید CarInputManager#releaseInputEventCapture را فراخوانی کنند.
نمودار زیر گردش کار یک رویداد ورودی سفارشی OEM را نشان میدهد.

خدمات سیستم عامل اندروید OEM
تولیدکنندگان اصلی تجهیزات (OEM) سرویس سیستم اندروید خود را برای مدیریت CustomInputEvents ورودی از CarInputService ارائه میدهند.
فقط سرویسهایی که با مجوز android.permission.INJECT_EVENTS علامتگذاری شدهاند میتوانند CustomInputEvents را از Car Input API ( CarInputManager ) ثبت و دریافت کنند. هیچ سرویس یا برنامه شخص ثالثی نمیتواند با این مجوز سیستم اندروید امضا شود (فقط سرویسهای OEM). بنابراین، هیچ سرویس یا برنامه شخص ثالثی نمیتواند در برابر Car Input API ثبت نام کند.
سرویسهای سیستمی اندروید OEM میتوانند به SystemApi و متدهای عمومی دسترسی داشته باشند.
پیادهسازی مرجع
به پیادهسازی مرجع در packages/services/Car/tests/SampleCustomInputService که به عنوان مثال و راهنما ارائه شده است، مراجعه کنید. برای مثال، برای اضافه کردن یک دکمه جدید در کنترل فرمان. با فشردن این دکمه جدید، برنامه نقشه با موقعیت مکانی فعلی خودرو اجرا میشود.
در این مثال، تولیدکننده اصلی (OEM) INPUT_CODE_F1 (اولین تابع CustomInputEvent ) را برای نمایش این ویژگی جدید (باز کردن برنامه نقشه با موقعیت مکانی فعلی خودرو) انتخاب کرده است.
در طول راهاندازی، این سرویس خود را از طریق requestInputEventCapture در CarInputManager ثبت میکند (به کد ثبت پیادهسازی مرجع مراجعه کنید).
هنگام دریافت CustomInputEvents ورودی، این سرویس intent را برای شروع برنامه نقشه ارسال میکند. برای یادگیری نحوه انجام این کار، به CustomInputEventListener.java مراجعه کنید.