افزودن پشتیبانی از «سیستم‌عامل 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 دستورالعمل‌های کیفیت ثبت شده است، انجام می‌شود.

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

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

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

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

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

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

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

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

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

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

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

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

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

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 ویژه خودروها را ببینید.

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

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

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

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

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

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

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

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

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

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