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

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

برنامه موجود خود را روی یک شبیه‌ساز سیستم عامل اندروید خودرو آزمایش کنید

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

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

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

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

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

ویژگی‌های مورد نیاز سیستم عامل اندروید خودرو

تمام برنامه‌های ساخته شده برای سیستم عامل اندروید اتوموبیل باید الزامات خاصی را برای توزیع با استفاده از گوگل پلی برآورده کنند. برای اطلاعات بیشتر به «ملاقات با الزامات ویژگی گوگل پلی» مراجعه کنید.

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

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

الزامات مربوط به حواس‌پرتی راننده را رعایت کنید

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

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

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

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

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

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

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

پخش را متوقف کنید و از ادامه پخش جلوگیری کنید

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

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

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

برای گوش دادن به محدودیت‌های UX، ابتدا یک وابستگی به کتابخانه android.car در فایل build.gradle ماژول برنامه خود اضافه کنید. این یک افزونه برای SDK اندروید است که APIهایی را ارائه می‌دهد که مخصوص سیستم عامل 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. برنامه خود را روی یک ایمیج سیستمی بدون فروشگاه گوگل پلی یا حالت سازگاری نصب کنید.
  2. با باز بودن شبکه برنامه لانچر، رانندگی را شبیه‌سازی کنید و تأیید کنید که برنامه شما قابل باز شدن نیست.
  3. شبیه‌سازی رانندگی را متوقف کنید و برنامه خود را باز کنید تا صفحه پخش باز شود و پخش را شروع کنید.
  4. دوباره رانندگی را شبیه‌سازی کنید و بررسی کنید که پخش متوقف می‌شود.
    1. اگر برنامه شما از ادغام با MediaSession پشتیبانی می‌کند، adb shell cmd media_session dispatch play استفاده کنید و تأیید کنید که پخش از سر گرفته نمی‌شود.

اپلیکیشن خود را برای سیستم عامل اندروید اتوموبیل بهینه کنید

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

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

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

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

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

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

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

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

<!-- 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>

اگر برنامه شما از لبه به لبه استفاده می‌کند، در مورد اندازه، تعداد، نوع یا محل نوارهای سیستم فرضیه‌ای نداشته باشید. در عوض، از APIهای window insets برای چیدمان محتوای برنامه خود نسبت به نوارهای سیستم استفاده کنید. برای جزئیات بیشتر در مورد نحوه استفاده از این APIها، به بخش «نمایش محتوا از لبه به لبه در برنامه» مراجعه کنید. مقادیر padding با کدنویسی ثابت هرگز برای هیچ فرم فاکتوری توصیه نمی‌شوند، اما در خودروها احتمالاً برای نگه داشتن محتوا در ناحیه امن اصلاً کارساز نخواهند بود.

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

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

یک دستگاه با سیستم عامل اندروید اتوموبیل و نمایشگری که در سمت راست خمیده است.
شکل ۱ : یک دستگاه مجهز به سیستم عامل اندروید اتوموبیل با نمایشگری که در سمت راست منحنی است. ناحیه سبز، مستطیل امنی است که با کادر مرزی برش نمایشگر منحنی همپوشانی ندارد.

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

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

از آنجا که انواع بریدگی‌های نمایشگر موجود در دستگاه‌های دارای سیستم عامل اندروید اتوموتیو با دستگاه‌های تلفن همراه متفاوت است، از 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 برای اجتناب همیشگی از بریدگی یا ورود همیشگی به آن استفاده کنید. هنگام انتخاب مورد دوم، برای جزئیات بیشتر در مورد APIهای مربوط به بریدگی‌های نمایشگر، به بخش پشتیبانی از بریدگی‌های نمایشگر مراجعه کنید.

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

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

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

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

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

از طرف دیگر، اگر برنامه شما دارای یک کامپوننت Android Auto نیز باشد، می‌توانید از API CarConnection از کتابخانه برنامه Android for Cars برای تشخیص اینکه آیا برنامه روی سیستم عامل Android Automotive یا Android Auto اجرا می‌شود یا اینکه اصلاً به ماشین متصل نیست، استفاده کنید.

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

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

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

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

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

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

برای کمک به تطبیق برنامه خود برای خودروها، می‌توانید از توصیف‌کننده منبع car برای ارائه منابع جایگزین هنگام اجرا بر روی یک وسیله نقلیه با سیستم عامل اندروید اتوموتیو استفاده کنید. به عنوان مثال، اگر از منابع Dimension برای ذخیره مقادیر padding استفاده می‌کنید، می‌توانید از مقدار بزرگتری برای مجموعه منابع car استفاده کنید تا اهداف لمسی بزرگتر شوند.