افزودن پشتیبانی از «سیستم‌عامل Android Automotive» به برنامه پارک‌شده

هنگام توزیع برنامه در دستگاه‌های دارای «سیستم عامل Android Automotive»، ملاحظاتی وجود دارد که مختص این ضریب شکل است و باید از آن‌ها مطلع باشید. این راهنما این ملاحظات را توضیح می‌دهد.

برنامه موجودتان را در شبیه‌ساز «سیستم عامل Android Automotive» آزمایش کنید

برای شروع ساختن برنامه برای «سیستم عامل Android Automotive»، ابتدا برنامه موجودتان را در شبیه‌ساز «سیستم عامل Android Automotive» آزمایش کنید. برای راه‌اندازی شبیه‌ساز، مراحل آزمایش بااستفاده از شبیه‌ساز سیستم‌عامل Android Automotive را دنبال کنید. سپس می‌توانید با دنبال کردن دستورالعمل‌های موجود در اجرای برنامه در شبیه‌ساز، برنامه را اجرا کنید.

هنگام اجرای برنامه، مراقب مشکلات سازگاری باشید، مانند موارد زیر:

  • صفحه‌نمایش‌های اطلاعاتی-سرگرمی جهت‌های ثابتی دارند. برای برآورده کردن دستورالعمل‌های کیفیت برنامه خودرو، برنامه‌ها باید از هر دو جهت عمودی و افقی پشتیبانی کنند.
  • میاناهای برنامه‌سازی کاربردی که در دستگاه‌های دیگر دردسترس هستند ممکن است در سیستم‌عامل Android Automotive دردسترس نباشند. برای مثال، برخی‌از میاناهای برنامه‌سازی کاربردی «خدمات Google Play» در سیستم‌عامل Android Automotive دردسترس نیستند. برای جزئیات مربوط به نحوه رسیدگی به این مشکلات، بخش غیرفعال کردن ویژگی‌ها را ببینید.

پیکربندی فایل مانیفست برنامه

برای هدف‌یابی دستگاه‌های دارای سیستم عامل Android Automotive، برنامه‌تان باید ورودی‌های مانیفست خاصی داشته باشد. پس‌از اینکه با توزیع در دستگاه‌های دارای «سیستم‌عامل Android Automotive» موافقت کردید، Google Play برنامه‌های سازگار را بازبینی می‌کند تا مطمئن شود که برای استفاده در خودرو ایمن هستند. برای جزئیات بیشتر، توزیع در خودروها را ببینید.

ویژگی‌های لازم «سیستم عامل Android Automotive»

همه برنامه‌های ساخته‌شده برای سیستم عامل Android Automotive باید الزامات خاصی را برآورده کنند تا بتوانند بااستفاده از Google Play توزیع شوند. برای اطلاعات بیشتر، به برآورده کردن الزامات ویژگی Google Play مراجعه کنید.

ورودی‌های مانیفست مختص دسته

علاوه‌بر الزامات قبلی که برای همه برنامه‌های پارک‌شده اعمال می‌شود، دسته‌های ویدیو و بازی الزامات دیگری نیز دارند:

رعایت کردن الزامات «سطح دقت راننده»

هنگام ارائه برنامه به خودروها، جلوگیری از حواس‌پرتی راننده بسیار مهم است. برای برنامه‌های پارک‌شده، این کار عمدتاً با جلوگیری از استفاده از برنامه شما یا پخش صدا درحین فعال بودن محدودیت‌های تجربه کاربری (UX) انجام می‌شود، همان‌طور که در دستورالعمل‌های کیفیت DD-2 و DD-3 ذکر شده است.

جلوگیری از استفاده درحین فعال بودن محدودیت‌های تجربه کاربری

به‌طور پیش‌فرض، وقتی محدودیت‌های UX فعال است، نمی‌توان از فعالیت‌ها استفاده کرد یا آن‌ها را راه‌اندازی کرد. برای اطمینان از اینکه این رفتار برای برنامه‌تان اعمال می‌شود، نباید عنصر <meta-data> زیر را در هیچ‌کدام از عناصر <activity> در مانیفست خود داشته باشد:

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

اگر فعالیتی در برنامه شما هنگام فعال شدن محدودیت‌های UX ازسر گرفته شود، توسط فعالیتی که متعلق به سیستم‌عامل است پنهان می‌شود.

حداقل، فعالیت برنامه‌تان به وضعیت چرخه حیات «متوقف‌شده» منتقل می‌شود. این اتفاق به‌عنوان یک فراخوانی چرخه حیات onPause رخ می‌دهد که درطول آن باید پخش ویدیو و صدا را از برنامه‌تان موقتاً متوقف کنید.

در دستگاه‌هایی که شامل حالت سازگاری سیستم‌عامل Android Automotive هستند، مسدود کردن سیستم باعث می‌شود فعالیت‌های برنامه شما ازطریق وضعیت «متوقف‌شده» به وضعیت «متوقف‌شده» منتقل شود.

توقف بازپخش و جلوگیری از ازسرگیری بازپخش

برای برخی‌از برنامه‌ها، توقف موقت بازپخش درطول onPause() و ردیابی وضعیت برای جلوگیری از ازسرگیری بازپخش تا onResume() برای برآورده کردن الزامات حواس‌پرتی راننده کافی است.

اگر واکنش به فراخوانی‌های چرخه حیات برای برنامه‌تان کافی نیست، می‌توانید مستقیماً به وضعیت محدودیت UX گوش دهید، همان‌طور که در بخش زیر توضیح داده شده است. برای مثال، برنامه‌هایی که از تصویردرتصویر پشتیبانی می‌کنند ممکن است ترجیح دهند به‌جای داشتن بررسی‌های شرطی در فراخوانی‌های چرخه حیات، مستقیماً گوش دهند.

گوش دادن به محدودیت‌های تجربه کاربری

برای گوش دادن به محدودیت‌های UX، ابتدا وابستگی به کتابخانه android.car را در فایل build.gradle واحد برنامه‌تان اضافه کنید. این افزونه‌ای برای «کیت توسعه نرم‌افزار Android» است که میاناهای برنامه‌سازی کاربردی مختص «سیستم‌عامل Android Automotive» را ارائه می‌دهد.

android {
    ...
    useLibrary("android.car")
}

از CarUxRestrictionsManager برای خواندن وضعیت محدودیت UX استفاده کنید. سعی نکنید وضعیت محدودیت UX را از وضعیت سخت‌افزاری دیگر مانند دنده یا سرعت تعیین کنید، زیرا محدودیت‌های UX ممکن است از نمایشگری به نمایشگر دیگر در یک خودرو متفاوت باشد.

val car = Car.createCar(context) ?: return
val carUxRestrictionsManager =
    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as? CarUxRestrictionsManager ?: return

// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentCarUxRestrictions

// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions ->
    // Handle UX restrictions
}

// Don't forget to teardown and release resources when they're no longer needed
carUxRestrictionsManager.unregisterListener()
car.disconnect()

تنها مقداری که CarUxRestrictions ارائه می‌دهد و برنامه شما به آن ارجاع می‌دهد، مقدار برگشتی isRequiresDistractionOptimization است. مقادیر دیگر فقط برای فعالیت‌هایی که به‌عنوان «سطح دقت بهینه‌شده» علامت‌گذاری شده‌اند مربوط است.

آزمایش کردن پیاده‌سازی

بااستفاده از روال زیر، بررسی کنید که برنامه‌تان الزامات «سطح دقت راننده» را برآورده می‌کند:

  1. برنامه‌تان را روی ایمیج سیستم بدون «فروشگاه Google Play» یا حالت «سازگاری» نصب کنید.
  2. درحالی‌که جدول برنامه راه‌انداز باز است، رانندگی را شبیه‌سازی کنید و بررسی کنید که برنامه‌تان باز نشود.
  3. شبیه‌سازی رانندگی را متوقف کنید و برنامه را در صفحه بازپخش باز کنید و بازپخش را شروع کنید.
  4. رانندگی را دوباره شبیه‌سازی کنید و مطمئن شوید بازپخش موقتاً متوقف می‌شود.
    1. اگر برنامه‌تان از ادغام با MediaSession پشتیبانی می‌کند، از adb shell cmd media_session dispatch play استفاده کنید و درستی‌سنجی کنید که بازپخش ازسر گرفته نشود.

برنامه‌تان را برای «سیستم عامل Android Automotive» بهینه‌سازی کنید

برای ارائه بهترین تجربه ممکن به کاربران در خودرو، هنگام ساختن برنامه برای «سیستم‌عامل Android Automotive» موارد زیر را درنظر داشته باشید:

کار با تورفتگی‌های پنجره و برش‌های نمایشگر

مانند سایر عوامل شکل، سیستم عامل Android Automotive شامل عناصر میانای کاربر سیستم، مانند نوارهای وضعیت و ناوبری، و پشتیبانی از نمایشگرهای غیرمستطیلی است.

به‌طور پیش‌فرض، برنامه‌ها در منطقه‌ای رسم می‌کنند که با نوارهای سیستم یا برش‌های نمایشگر هم‌پوشانی ندارد. بااین‌حال، ممکن است بخواهید برنامه‌تان نوارهای سیستم را پنهان کند، محتوا را پشت آن‌ها ترسیم کند، یا محتوا را در برش نمایشگر نشان دهد، همان‌طور که در چیدمان برنامه در حاشیه‌های پنجره شرح داده شده است. اگر برنامه‌تان هرکدام از این کارها را انجام می‌دهد، برای جزئیات بیشتر درباره نحوه عملکرد خوب برنامه‌تان در سراسر بوم‌سازگان دستگاه‌های «سیستم عامل Android Automotive»، به زیربخش‌های زیر مراجعه کنید.

نوارهای سیستم، حالت فراگیر، و پرداز لبه‌به‌لبه

اندازه و موقعیت نوارهای سیستم در خودروها ممکن است با سایر انواع دستگاه‌ها متفاوت باشد. برای مثال، نوارهای پیمایش ممکن است در سمت چپ، راست، یا پایین صفحه قرار داشته باشند. حتی در شرایطی که نوار وضعیت در بالا و نوار پیمایش در پایین وجود دارد (همان‌طور که در اکثر تلفن‌ها و رایانه‌های لوحی وجود دارد)، اندازه این عناصر احتمالاً در خودروها بسیار بزرگ‌تر خواهد بود.

علاوه‌براین، سیستم عامل Android Automotive به سازندگان تجهیزات اصلی اجازه می‌دهد کنترل کنند که آیا برنامه‌ها می‌توانند نوارهای سیستم را برای ورود به حالت فراگیر و خروج از آن نشان دهند یا پنهان کنند یا نه. برای مثال، با جلوگیری از پنهان کردن نوارهای سیستم توسط برنامه‌ها، سازندگان تجهیزات اصلی می‌توانند اطمینان حاصل کنند که کنترل‌های خودرو، مانند کنترل‌های تهویه هوا، همیشه روی صفحه دردسترس هستند. اگر سازنده اصلی محصول از کنترل نوارهای سیستم توسط برنامه‌ها جلوگیری کرده باشد، وقتی برنامه‌ای برای نمایش یا پنهان کردن نوارهای سیستم با میاناهای برنامه‌سازی کاربردی WindowInsetsController (یا WindowInsetsControllerCompat) تماس می‌گیرد، هیچ اتفاقی نمی‌افتد. برای کسب اطلاعات بیشتر درباره نحوه تشخیص اینکه آیا برنامه‌تان توانسته است حاشیه‌ها را اصلاح کند یا نه، به اسناد show و hide مراجعه کنید.

به‌همین ترتیب، سازندگان تجهیزات اصلی نیز می‌توانند کنترل کنند که آیا برنامه‌ها می‌توانند رنگ و شفافیت نوارهای سیستم را تنظیم کنند یا نه تا اطمینان حاصل شود که نوارها و عناصر موجود در آن‌ها همیشه به‌وضوح قابل‌مشاهده هستند. اگر برنامه‌تان لب‌به‌لب رسم می‌کند، بررسی کنید که فقط محتوای غیربحرانی در پشت نوارهای سیستم رسم شود. اگر سازنده اصلی محصول دستگاه از تنظیم رنگ یا شفافیت نوارها جلوگیری کند، ممکن است این محتوا قابل‌مشاهده نباشد.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

اگر برنامه‌تان سرتاسری است، درباره اندازه، تعداد، نوع، یا مکان نوارهای سیستم پیش‌فرض نسازید. به‌جای آن، از میاناهای برنامه‌سازی کاربردی حاشیه‌های پنجره برای چیدمان محتوای برنامه‌تان نسبت‌به نوارهای سیستم استفاده کنید. برای جزئیات بیشتر درباره نحوه استفاده از این میاناهای برنامه‌سازی کاربردی، نمایش محتوا به‌صورت لبه‌به‌لبه در برنامه را ببینید. مقادیر حاشیه داخلی کدگذاری‌شده هرگز برای هیچ‌یک از انواع دستگاه‌ها توصیه نمی‌شود، اما در خودروها احتمالاً اصلاً برای نگه داشتن محتوا در منطقه امن کار نخواهند کرد.

سازگاری با نمایشگرهای دارای شکل نامنظم

علاوه‌بر نمایشگرهای مستطیلی، برخی‌از خودروها ممکن است صفحه‌نمایش‌هایی با شکل نامنظم داشته باشند، مانند آنچه در شکل ۱ نشان داده شده است:

دستگاه Android Automotive OS با نمایشگری که در سمت راست منحنی است.
شکل ۱: دستگاهی با سیستم‌عامل Android Automotive که نمایشگر آن در سمت راست خمیده است. ناحیه سبز مستطیل امنی است که با چارگوش مرزی برش نمایشگر منحنی هم‌پوشانی ندارد.

اگر برنامه‌تان لب‌به‌لب ارائه نمی‌شود، لازم نیست کاری انجام دهید تا در محدوده امن ارائه شود.

اگر برنامه‌تان لبه‌به‌لبه ارائه می‌شود، می‌توانید انتخاب کنید که دررابطه‌با برش‌های نمایشگر چگونه رفتار کند. می‌توانید این کار را بااستفاده از منابع ازطریق تنظیم کردن مشخصه android:windowLayoutInDisplayCutoutMode برای زمینه برنامه‌تان یا در زمان اجرا ازطریق اصلاح کردن مشخصه layoutInDisplayCutoutMode پنجره انجام دهید.

چون انواع برش‌های نمایشگر موجود در دستگاه‌های «سیستم‌عامل Android Automotive» با انواع موجود در دستگاه‌های همراه متفاوت است، از LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT یا LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES استفاده نکنید، زیرا رفتار آن‌ها برای برش‌های موجود در دستگاه‌های همراه بهینه‌سازی شده است. درعوض، از LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER یا LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS استفاده کنید تا همیشه از بریدگی اجتناب شود یا همیشه وارد بریدگی شود. هنگام انتخاب گزینه دوم، برای جزئیات بیشتر درباره میاناهای برنامه‌سازی کاربردی مربوط به برش‌های نمایشگر، به پشتیبانی از برش‌های نمایشگر مراجعه کنید.

اگر برنامه‌تان در ناحیه برش نمایشگر رندر می‌شود و می‌خواهید رفتار متفاوتی بین سیستم‌عامل Android Automotive و تلفن همراه داشته باشید، برای راهنمایی به غیرفعال کردن ویژگی‌ها مراجعه کنید اگر برنامه‌تان این رفتار را در زمان اجرا تنظیم می‌کند و از منابع جایگزین استفاده کنید اگر برنامه‌تان این رفتار را بااستفاده از فایل‌های منبع تنظیم می‌کند.

غیرفعال کردن ویژگی‌ها

اگر برنامه تلفن همراه موجودی را در «سیستم‌عامل Android Automotive» دردسترس قرار می‌دهید، برخی‌از ویژگی‌ها و عملکردها ممکن است مرتبط یا دردسترس نباشند. برای مثال، خودروها معمولاً دسترسی به دوربین را ارائه نمی‌دهند. علاوه‌براین، فقط زیرمجموعه‌ای از خدمات Google Play در سیستم‌عامل Android Automotive دردسترس است؛ برای جزئیات بیشتر، خدمات Google Play برای خودروها را ببینید.

می‌توانید از میانای برنامه‌سازی کاربردی PackageManager.hasSystemFeature استفاده کنید تا با بررسی ویژگی FEATURE_AUTOMOTIVE تشخیص دهید که برنامه در سیستم عامل Android Automotive اجرا می‌شود یا نه، همان‌طور که در مثال زیر نشان داده شده است:

val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
    // Enable or disable a given feature
}

همچنین، اگر برنامه‌تان مؤلفه Android Auto نیز دارد، می‌توانید از میانای برنامه‌سازی کاربردی CarConnection از کتابخانه برنامه Android برای ماشین‌ها استفاده کنید تا تشخیص دهید برنامه در سیستم عامل Android Automotive یا Android Auto اجرا می‌شود یا اصلاً به خودرو متصل نیست.

برای تصویردرتصویر (PiP)، روال‌های مطلوب تثبیت‌شده را دنبال کنید تا بررسی کنید آیا ویژگی دردسترس است یا نه و به‌طور مناسب واکنش نشان دهید.

مدیریت سناریوهای آفلاین

درحالی‌که خودروها به‌طور فزاینده‌ای به اینترنت متصل می‌شوند، توصیه می‌شود برنامه‌ها اجرا شدن بدون اتصال اینترنت را مدیریت کنند، مثلاً در موارد زیر:

  • ممکن است کاربران از داده تلفن همراه که به‌عنوان بخشی از بسته اشتراک ازسوی سازنده خودرو ارائه می‌شود انصراف دهند.
  • دسترسی به داده تلفن همراه ممکن است در برخی مناطق محدود باشد.
  • خودروهای دارای رادیو Wi-Fi ممکن است خارج از محدوده Wi-Fi باشند، یا OEM ممکن است Wi-Fi را به‌نفع شبکه تلفن همراه خاموش کند.

با تنزل متین عملکردی که به دسترسی به اینترنت وابسته است، مثلاً با ارائه محتوای آفلاین، برای مدیریت این سناریوها در برنامه‌تان آماده باشید. برای اطلاعات بیشتر، روال‌های مطلوب برای بهینه‌سازی شبکه‌سازی را ببینید.

استفاده از منابع جایگزین

برای کمک به سازگار کردن برنامه‌تان با خودروها، می‌توانید از توصیف‌گر منبع car برای ارائه منابع جایگزین هنگام اجرا در خودروهای دارای «سیستم عامل Android Automotive» استفاده کنید. برای مثال، اگر از منابع بُعد برای ذخیره مقادیر حاشیه داخلی استفاده می‌کنید، می‌توانید از مقدار بزرگ‌تری برای مجموعه منابع car استفاده کنید تا هدف‌های لمسی بزرگ‌تر شوند.