سیستم عامل Android Automotive به کاربران اجازه می دهد برنامه ها را در ماشین نصب کنند. برای دسترسی به کاربران در این پلتفرم، باید یک برنامه بهینه سازی شده برای راننده را که با سیستم عامل Android Automotive سازگار است، توزیع کنید. میتوانید تقریباً از همه کدها و منابع موجود در برنامه Android Auto خود دوباره استفاده کنید، اما باید یک ساخت جداگانه ایجاد کنید که شرایط موجود در این صفحه را برآورده کند.
مروری بر توسعه
افزودن پشتیبانی از سیستم عامل Android Automotive فقط به چند مرحله نیاز دارد، همانطور که در بخش های زیر توضیح داده شده است:
- ویژگیهای خودرو را در Android Studio فعال کنید .
- یک ماژول خودرو ایجاد کنید .
- وابستگی های Gradle خود را به روز کنید .
- به صورت اختیاری، تنظیمات و فعالیتهای ورود به سیستم را اجرا کنید .
- در صورت تمایل، نکات میزبان رسانه را بخوانید .
ملاحظات طراحی
سیستم عامل Android Automotive از چیدمان محتوای رسانه ای که از سرویس مرورگر رسانه برنامه شما دریافت می کند مراقبت می کند. این بدان معنی است که برنامه شما رابط کاربری را ترسیم نمی کند و زمانی که کاربر پخش رسانه را فعال می کند، هیچ یک از فعالیت های شما را شروع نمی کند.
اگر تنظیمات یا فعالیتهای ورود به سیستم را اجرا میکنید، این فعالیتها باید برای خودرو بهینه شوند. هنگام طراحی آن مناطق از برنامه خود، به دستورالعمل های طراحی برای سیستم عامل Android Automotive مراجعه کنید.
پروژه خود را تنظیم کنید
برای فعال کردن پشتیبانی از سیستم عامل Android Automotive، باید چندین بخش از پروژه برنامه خود را تنظیم کنید.
فعال کردن ویژگیهای خودرو در Android Studio
از Android Studio نسخه 4.0 یا بالاتر برای اطمینان از فعال بودن همه ویژگیهای Automotive OS استفاده کنید.
یک ماژول خودرو ایجاد کنید
برخی از اجزای سیستمعامل Android Automotive، مانند مانیفست، نیازمندیهای خاص پلتفرم هستند. ماژولی ایجاد کنید که بتواند کد این مؤلفهها را از کدهای دیگر پروژه شما جدا نگه دارد، مانند کدی که برای برنامه تلفن شما استفاده میشود.
برای افزودن یک ماژول خودرو به پروژه خود این مراحل را دنبال کنید:
- در Android Studio، روی File > New > New Module کلیک کنید.
- Automotive Module را انتخاب کنید، سپس روی Next کلیک کنید.
- نام برنامه/کتابخانه را وارد کنید. این نامی است که کاربران برای برنامه شما در سیستم عامل Android Automotive می بینند.
- نام ماژول را وارد کنید.
- نام بسته را برای مطابقت با برنامه خود تنظیم کنید.
API 28: Android 9.0 (Pie) را برای Minimum SDK انتخاب کنید و سپس روی Next کلیک کنید.
همه خودروهایی که از سیستمعامل Android Automotive پشتیبانی میکنند، روی Android 9 (سطح API 28) یا بالاتر اجرا میشوند، بنابراین انتخاب این مقدار همه خودروهای سازگار را هدف قرار میدهد.
No Activity را انتخاب کنید و سپس روی Finish کلیک کنید.
پس از ایجاد ماژول در Android Studio، AndroidManifest.xml
در ماژول جدید خودرو خود باز کنید:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.media">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
<uses-feature
android:name="android.hardware.type.automotive"
android:required="true" />
</manifest>
عنصر application
دارای برخی اطلاعات استاندارد برنامه و همچنین یک عنصر uses-feature
است که پشتیبانی از سیستم عامل Android Automotive را اعلام می کند. توجه داشته باشید که هیچ فعالیتی در مانیفست اعلام نشده است.
اگر تنظیمات یا فعالیتهای ورود به سیستم را اجرا میکنید، آنها را اینجا اضافه کنید. این فعالیتها توسط سیستم با استفاده از مقاصد صریح راهاندازی میشوند و تنها فعالیتهایی هستند که در مانیفست برای برنامه Android Automotive OS خود اعلام میکنید.
پس از افزودن هر گونه تنظیمات یا فعالیت های ورود به سیستم، فایل مانیفست خود را با تنظیم ویژگی android:appCategory="audio"
در عنصر application
و افزودن عناصر uses-feature
زیر تکمیل کنید:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.media"> <application android:allowBackup="true" android:appCategory="audio" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" /> <uses-feature android:name="android.hardware.type.automotive" android:required="true" /> <uses-feature android:name="android.hardware.wifi" android:required="false" /> <uses-feature android:name="android.hardware.screen.portrait" android:required="false" /> <uses-feature android:name="android.hardware.screen.landscape" android:required="false" /> </manifest>
تنظیم صریح این ویژگیها بر روی required="false"
تضمین میکند که برنامه شما با ویژگیهای سختافزاری موجود در دستگاههای سیستمعامل Automotive در تضاد نیست.
اعلام پشتیبانی رسانه ای از سیستم عامل Android Automotive
از ورودی مانیفست زیر برای اعلام اینکه برنامه شما از سیستم عامل Android Automotive پشتیبانی می کند استفاده کنید:
<application>
...
<meta-data android:name="com.android.automotive"
android:resource="@xml/automotive_app_desc"/>
...
</application>
این ورودی مانیفست به یک فایل XML اشاره دارد که قابلیتهای خودرویی را که برنامه شما پشتیبانی میکند، اعلام میکند.
برای نشان دادن اینکه یک برنامه رسانه دارید، یک فایل XML به نام automotive_app_desc.xml
را به دایرکتوری res/xml/
پروژه خود اضافه کنید. مطالب زیر را در این فایل قرار دهید:
<automotiveApp>
<uses name="media"/>
</automotiveApp>
فیلترهای هدف
سیستم عامل Android Automotive از اهداف صریح برای فعال کردن فعالیتها در برنامه رسانه شما استفاده میکند. هیچ فعالیتی که دارای فیلترهای هدف CATEGORY_LAUNCHER
یا ACTION_MAIN
است در فایل مانیفست قرار ندهید.
فعالیتهایی مانند نمونه زیر معمولاً تلفن یا دستگاه تلفن همراه دیگری را هدف قرار میدهند. این فعالیتها را در ماژولی که برنامه تلفن را میسازد، اعلام کنید، نه در ماژولی که برنامه Android Automotive OS شما را میسازد.
<activity android:name=".MyActivity">
<intent-filter>
<!-- You can't use either of these intents for Android Automotive OS -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!--
In their place, you can include other intent filters for any activities
that your app needs for Android Automotive OS, such as settings or
sign-in activities.
-->
</intent-filter>
</activity>
وابستگی های Gradle خود را به روز کنید
توصیه می کنیم که سرویس مرورگر رسانه خود را در یک ماژول جداگانه که بین برنامه تلفن و ماژول خودرو خود به اشتراک می گذارید، نگه دارید. اگر از این روش استفاده میکنید، باید ماژول خودروی خود را بهروزرسانی کنید تا ماژول اشتراکگذاری شده را نیز در بر بگیرد، همانطور که در قطعه زیر نشان داده شده است:
my-auto-module /build.gradle
شیار
buildscript { ... dependencies { ... implementation project(':shared_module_name') } }
کاتلین
buildscript { ... dependencies { ... implementation(project(":shared_module_name")) } }
تنظیمات و فعالیت های ورود به سیستم را اجرا کنید
علاوه بر سرویس مرورگر رسانه خود، میتوانید تنظیمات بهینهسازی شده خودرو و فعالیتهای ورود به سیستم را برای برنامه Android Automotive OS خود نیز ارائه دهید. این فعالیتها به شما امکان میدهند عملکرد برنامهای را ارائه کنید که در APIهای Android Media گنجانده نشده است.
فقط در صورتی این فعالیتها را اجرا کنید که برنامه سیستمعامل Android Automotive شما باید به کاربران اجازه ورود به سیستم را بدهد یا تنظیمات برنامه را مشخص کنند. Android Auto از این فعالیتها استفاده نمیکند.
گردش کار فعالیت
نمودار زیر نحوه تعامل کاربر با تنظیمات و فعالیت های ورود به سیستم شما با استفاده از سیستم عامل Android Automotive را نشان می دهد:
شکل 1. تنظیمات و گردش کار فعالیت ورود به سیستم.
از حواس پرتی در تنظیمات و فعالیت های ورود به سیستم خودداری کنید
برای اطمینان از اینکه تنظیمات و/یا فعالیتهای ورود به سیستم شما فقط برای استفاده در زمانی که خودروی کاربر پارک شده است در دسترس است، بررسی کنید که عنصر(های) <activity>
شامل عنصر <meta-data>
زیر نباشد. در صورت وجود چنین عنصری، برنامه شما در طول بررسی رد خواهد شد.
<!-- NOT ALLOWED -->
<meta-data
android:name="distractionOptimized"
android:value="true"/>
یک فعالیت تنظیمات اضافه کنید
می توانید یک فعالیت تنظیمات بهینه شده برای خودرو اضافه کنید تا کاربران بتوانند تنظیمات برنامه شما را در ماشین خود پیکربندی کنند. فعالیت تنظیمات شما همچنین میتواند گردشهای کاری دیگری مانند ورود یا خروج از حساب کاربر یا تغییر حساب کاربری را فراهم کند. به یاد داشته باشید که این فعالیت فقط توسط یک برنامه در حال اجرا در سیستم عامل Android Automotive فعال می شود. برنامههای تلفن متصل به Android Auto از آن استفاده نمیکنند.
یک فعالیت تنظیمات را اعلام کنید
همانطور که در قطعه کد زیر نشان داده شده است، باید فعالیت تنظیمات خود را در فایل مانیفست برنامه خود اعلام کنید:
<application>
...
<activity android:name=".AppSettingsActivity"
android:exported="true"
android:theme="@style/SettingsActivity"
android:label="@string/app_settings_activity_title">
<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
</intent-filter>
</activity>
...
</application>
فعالیت تنظیمات خود را پیاده سازی کنید
هنگامی که یک کاربر برنامه شما را راه اندازی می کند، سیستم عامل Android Automotive فعالیت تنظیماتی را که شما اعلام کرده اید شناسایی می کند و هزینه ای مانند یک نماد را نمایش می دهد. کاربر میتواند با استفاده از نمایشگر خودروی خود، برای پیمایش به فعالیت، روی این قیمت ضربه زده یا انتخاب کند. سیستم عامل Android Automotive هدف ACTION_APPLICATION_PREFERENCES
را ارسال می کند که به برنامه شما می گوید فعالیت تنظیمات شما را شروع کند.
بقیه این بخش نشان می دهد که چگونه می توانید کد برنامه نمونه برنامه پخش موسیقی جهانی Android (UAMP) را برای اجرای یک فعالیت تنظیمات برای برنامه خود تطبیق دهید.
برای شروع، کد نمونه را دانلود کنید:
# Clone the UAMP repositorygit clone https://github.com/android/uamp.git
# Fetch the appropriate pull request to your local repositorygit fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME
# Switch to the new branchgit checkout NEW_LOCAL_BRANCH_NAME
برای اجرای فعالیت خود، مراحل زیر را دنبال کنید:
- پوشه
automotive/automotive-lib
در ماژول automotive خود کپی کنید. - یک درخت ترجیحات را در
automotive/src/main/res/xml/preferences.xml
تعریف کنید. یک
PreferenceFragmentCompat
را اجرا کنید که فعالیت تنظیمات شما نمایش داده می شود. برای اطلاعات بیشتر به فایلهایSettingsFragment.kt
وSettingsActivity.kt
در UAMP و راهنمای تنظیمات Android مراجعه کنید.
همانطور که فعالیت تنظیمات خود را اجرا می کنید، این بهترین روش ها را برای استفاده از برخی از مؤلفه های موجود در کتابخانه Preference در نظر بگیرید:
- در فعالیت تنظیمات خود بیش از دو سطح عمق زیر نمای اصلی نداشته باشید.
- از
DropDownPreference
استفاده نکنید. به جای آن ازListPreference
استفاده کنید. - اجزای سازمانی:
-
PreferenceScreen
- این باید سطح بالای درخت ترجیحات شما باشد.
-
PreferenceCategory
- برای گروه بندی اشیاء
Preference
با هم استفاده می شود. -
title
درج کنید.
- برای گروه بندی اشیاء
-
- یک
key
وtitle
در تمام اجزای زیر بگنجانید. همچنین می توانید یکsummary
، یکicon
یا هر دو را اضافه کنید:-
Preference
- منطق موجود در
onPreferenceTreeClick()
در اجرایPreferenceFragmentCompat
خود سفارشی کنید.
- منطق موجود در
-
CheckBoxPreference
- می تواند به جای
summary
برای متن شرطیsummaryOn
یاsummaryOff
داشته باشد.
- می تواند به جای
-
SwitchPreference
- می تواند به جای
summary
برای متن شرطیsummaryOn
یاsummaryOff
داشته باشد. - می تواند
switchTextOn
یاswitchTextOff
داشته باشد.
- می تواند به جای
-
SeekBarPreference
-
min
،max
، وdefaultValue
را شامل شود.
-
-
EditTextPreference
- شامل
dialogTitle
،positiveButtonText
، وnegativeButtonText
. - می تواند
dialogMessage
و/یاdialogLayoutResource
داشته باشد.
- شامل
-
com.example.android.uamp.automotive.lib.ListPreference
- بیشتر از
ListPreference
مشتق شده است. - برای نمایش یک لیست تک گزینه ای از اشیاء
Preference
استفاده می شود. - باید دارای آرایه ای از
entries
وentryValues
مربوطه باشد.
- بیشتر از
-
com.example.android.uamp.automotive.lib.MultiSelectListPreference
- بیشتر از
MultiSelectListPreference
مشتق شده است - برای نمایش یک لیست چند گزینه ای از اشیاء
Preference
استفاده می شود. - باید دارای آرایه ای از
entries
وentryValues
مربوطه باشد.
- بیشتر از
-
یک فعالیت ورود به سیستم اضافه کنید
اگر برنامه شما قبل از اینکه کاربر بتواند از برنامه شما استفاده کند، نیاز به ورود به سیستم دارد، میتوانید یک فعالیت ورود به سیستم بهینهشده برای وسیله نقلیه اضافه کنید که ورود و خروج از برنامه شما را کنترل میکند. همچنین میتوانید گردشهای کاری ورود به سیستم و خروج از سیستم را به یک فعالیت تنظیمات اضافه کنید، اما اگر تا زمانی که کاربر نمیتواند از برنامهتان استفاده کند، از یک فعالیت ورود به سیستم اختصاصی استفاده کنید. به یاد داشته باشید که این فعالیت فقط توسط برنامهای فعال میشود. در سیستم عامل Android Automotive. برنامههای تلفن متصل به Android Auto از آن استفاده نمیکنند.
در شروع برنامه باید وارد سیستم شوید
برای اینکه کاربر قبل از اینکه بتواند از برنامه شما استفاده کند به سیستم وارد شود، سرویس مرورگر رسانه شما باید کارهای زیر را انجام دهد:
- در متد
onLoadChildren()
سرویس شما، با استفاده از روشsendResult()
نتیجهnull
را ارسال کنید. -
PlaybackStateCompat
جلسه رسانه را با استفاده از متدsetState()
رویSTATE_ERROR
تنظیم کنید. این به سیستمعامل Android Automotive میگوید تا زمانی که خطا برطرف نشود، هیچ عملیات دیگری نمیتواند انجام شود. - کد خطای
PlaybackStateCompat
جلسه رسانه را رویERROR_CODE_AUTHENTICATION_EXPIRED
تنظیم کنید. این به سیستم عامل Android Automotive می گوید که کاربر باید احراز هویت کند. - پیام خطای
PlaybackStateCompat
جلسه رسانه را با استفاده از متدsetErrorMessage()
تنظیم کنید. از آنجا که این پیام خطا رو به کاربر است، آن را برای محلی فعلی کاربر بومی سازی کنید. با استفاده از متد
setExtras()
موارد اضافیPlaybackStateCompat
جلسه رسانه را تنظیم کنید. دو کلید زیر را شامل شود:-
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: رشتهای که روی دکمهای که گردش کار ورود به سیستم را آغاز میکند، نمایش داده میشود. از آنجا که این رشته رو به کاربر است، آن را برای محلی فعلی کاربر بومی سازی کنید. -
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
: یکPendingIntent
که وقتی کاربر روی دکمه اشاره شده توسطPLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
ضربه میزند، کاربر را به فعالیت ورود به سیستم شما هدایت میکند.
-
قطعه کد زیر نشان می دهد که چگونه برنامه شما می تواند قبل از استفاده از برنامه شما، کاربر را ملزم به ورود به سیستم کند:
کاتلین
import androidx.media.utils.MediaConstants val signInIntent = Intent(this, SignInActivity::class.java) val signInActivityPendingIntent = PendingIntent.getActivity(this, 0, signInIntent, 0) val extras = Bundle().apply { putString( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL, "Sign in" ) putParcelable( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT, signInActivityPendingIntent ) } val playbackState = PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f) .setErrorMessage( PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED, "Authentication required" ) .setExtras(extras) .build() mediaSession.setPlaybackState(playbackState)
جاوا
import androidx.media.utils.MediaConstants; Intent signInIntent = new Intent(this, SignInActivity.class); PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0, signInIntent, 0); Bundle extras = new Bundle(); extras.putString( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL, "Sign in"); extras.putParcelable( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT, signInActivityPendingIntent); PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f) .setErrorMessage( PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED, "Authentication required" ) .setExtras(extras) .build(); mediaSession.setPlaybackState(playbackState);
پس از تأیید هویت کاربر، PlaybackStateCompat
را به حالتی غیر از STATE_ERROR
برگردانید، سپس با فراخوانی متد finish()
کاربر را به سیستم عامل Android Automotive برگردانید.
فعالیت ورود به سیستم خود را اجرا کنید
Google ابزارهای هویتی مختلفی را ارائه میکند که میتوانید از آنها برای کمک به کاربران برای ورود به برنامه شما در خودروهایشان استفاده کنید. برخی از ابزارها، مانند Firebase Authentication، مجموعههای ابزار تمام پشته را ارائه میکنند که میتوانند به شما در ایجاد تجربههای احراز هویت سفارشی کمک کنند. ابزارهای دیگر از اعتبارنامه یا سایر فناوریهای موجود کاربر استفاده میکنند تا به شما کمک کنند تا تجربههای ورود یکپارچه برای کاربران ایجاد کنید.
ابزارهای زیر میتوانند به شما کمک کنند تا تجربه ورود آسانتری را برای کاربرانی که قبلاً در دستگاه دیگری وارد سیستم شدهاند ایجاد کنید:
- ورود و ثبت نام با یک ضربه: اگر قبلاً One Tap را برای دستگاههای دیگر مانند برنامه تلفن خود پیادهسازی کردهاید، آن را برای برنامه Android Automotive OS خود اجرا کنید تا از کاربران موجود One Tap پشتیبانی کند.
- Google Sign-in: اگر قبلاً Google Sign-in را برای دستگاههای دیگر مانند برنامه تلفن خود پیادهسازی کردهاید، Google Sign-in را برای برنامه Android Automotive OS خود برای پشتیبانی از کاربران موجود Google Sign-in اجرا کنید.
- تکمیل خودکار با Google: اگر کاربران در سایر دستگاههای Android خود از تکمیل خودکار با Google استفاده کرده باشند، اطلاعات کاربری آنها در مدیر رمز عبور Google ذخیره میشود. هنگامی که این کاربران وارد برنامه سیستم عامل Android Automotive شما میشوند، تکمیل خودکار با Google اعتبارنامههای ذخیره شده مرتبط را پیشنهاد میکند. استفاده از تکمیل خودکار با Google به هیچ تلاشی برای توسعه برنامه نیاز ندارد. با این حال، توسعه دهندگان برنامه می توانند برنامه های خود را برای نتایج با کیفیت بهتر بهینه کنند . تکمیل خودکار با Google توسط همه دستگاههای دارای Android 8.0 (سطح API 26) یا بالاتر، از جمله سیستم عامل Android Automotive پشتیبانی میشود.
از AccountManager استفاده کنید
برنامههای سیستمعامل Android Automotive که دارای احراز هویت هستند، به دلایل زیر باید از AccountManager استفاده کنند:
- UX بهتر و مدیریت آسان حساب: کاربران می توانند به راحتی تمام حساب های خود را از منوی حساب ها در تنظیمات سیستم مدیریت کنند، از جمله ورود و خروج.
- تجربیات "مهمان": خودروها دستگاه های مشترکی هستند، به این معنی که OEM ها می توانند تجربه های "مهمان" را در وسیله نقلیه فعال کنند، جایی که نمی توان حساب ها را اضافه کرد. این محدودیت با استفاده از
DISALLOW_MODIFY_ACCOUNTS
برایAccountManager
به دست میآید.
مجوزها
اگر نیاز به درخواست مجوز از کاربر دارید، از همان جریان فعالیت احراز هویت یا فعالیت تنظیمات در نمودار گردش کار فعالیت که در بخش قبلی نشان داده شده است استفاده کنید.
نکات میزبان رسانه را بخوانید
بسته به برنامه سیستم (از جمله نسخه آن) که به سرویس مرورگر رسانه شما متصل می شود، برنامه شما ممکن است موارد اضافی زیر را دریافت کند:
رسیدگی به خطا
خطاها در برنامههای رسانه در سیستمعامل Android Automotive از طریق PlaybackStateCompat
جلسه رسانه منتقل میشوند. برای همه خطاها، کد خطا و پیام خطای مناسب را در PlaybackStateCompat
تنظیم کنید. این باعث می شود یک Toast
در رابط کاربری ظاهر شود.
هنگامی که خطایی رخ می دهد اما پخش می تواند ادامه یابد، یک خطای غیر کشنده صادر کنید. به عنوان مثال، یک کاربر ممکن است بتواند قبل از ورود به سیستم، موسیقی را در یک برنامه پخش کند، اما قبل از اینکه بتواند آهنگی را رد کند، باید وارد سیستم شود. وقتی از یک خطای غیرمرگبار استفاده میکنید، سیستم میتواند به کاربر پیشنهاد کند بدون وقفه در پخش مورد رسانه فعلی، وارد سیستم شود.
هنگامی که یک خطای غیر کشنده صادر می کنید، به غیر از کد خطا و پیام خطا، بقیه PlaybackStateCompat
را همانطور که هست حفظ کنید. استفاده از این رویکرد به پخش مورد رسانه فعلی اجازه می دهد تا زمانی که کاربر تصمیم می گیرد وارد سیستم شود یا خیر.
هنگامی که پخش امکان پذیر نیست، مانند زمانی که اتصال اینترنت وجود ندارد و محتوای آفلاین وجود ندارد، وضعیت PlaybackStateCompat
را روی STATE_ERROR
تنظیم کنید.
در بهروزرسانیهای بعدی PlaybackStateCompat
، کدهای خطا و پیامهای خطا را پاک کنید تا از نمایش چندین هشدار برای همان خطا جلوگیری کنید.
اگر در هر نقطه نتوانستید درخت مرور را بارگیری کنید - به عنوان مثال، اگر به احراز هویت نیاز دارید و کاربر وارد نشده است - یک درخت مرور خالی ارسال کنید. برای نشان دادن این، یک نتیجه تهی از onLoadChildren()
برای گره رسانه ریشه برگردانید. هنگامی که این اتفاق می افتد، سیستم یک خطای تمام صفحه را با پیام خطای تنظیم شده در PlaybackStateCompat
نمایش می دهد.
خطاهای قابل اقدام
اگر خطا قابل اجرا است، دو مورد اضافی زیر را نیز در PlaybackStateCompat
تنظیم کنید:
-
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: برچسبی برای کلیک روی دکمه برای رفع خطا. از آنجا که این رشته رو به کاربر است، آن را برای محلی فعلی کاربر بومی سازی کنید. -
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
:PendingIntent
که دکمه اجرا میکند تا خطا را برطرف کند، مانند راهاندازی فعالیت ورود به سیستم.
خطاهای قابل اجرا به صورت Dialog
ظاهر می شوند و تنها زمانی که خودرو متوقف شده باشد توسط کاربران قابل حل است.
تست موارد خطا
بررسی کنید که برنامه شما بهخوبی خطاها را در همه حالات مدیریت میکند، از جمله:
- سطوح مختلف محصول شما: به عنوان مثال، رایگان در مقابل حق بیمه یا ورود به سیستم در مقابل خارج از سیستم
- حالت های مختلف درایو: به عنوان مثال، پارک شده در مقابل رانندگی
- حالت های مختلف اتصال: به عنوان مثال، آنلاین در مقابل آفلاین
ملاحظات دیگر
این ملاحظات دیگر را هنگام توسعه برنامه سیستم عامل Android Automotive خود در نظر داشته باشید:
محتوای آفلاین
در صورت وجود، پشتیبانی از پخش آفلاین را اجرا کنید. انتظار میرود خودروهای دارای سیستمعامل Android Automotive اتصال دادهای خاص خود را داشته باشند، به این معنی که یک طرح داده در هزینه خودرو گنجانده شده یا توسط کاربر پرداخت میشود. با این حال، انتظار میرود که خودروها نسبت به دستگاههای تلفن همراه، اتصالات متغیر بیشتری داشته باشند.
در اینجا چند نکته وجود دارد که باید هنگام بررسی استراتژی پشتیبانی آفلاین خود در نظر داشته باشید:
- بهترین زمان برای دانلود محتوا زمانی است که برنامه شما در حال استفاده است.
- فرض نکنید که WiFi در دسترس است. یک ماشین ممکن است هرگز وارد محدوده WiFi نشود، یا OEM ممکن است WiFi را به نفع یک شبکه تلفن همراه غیرفعال کرده باشد.
- در حالی که ذخیره کردن هوشمندانه محتوای مورد انتظار کاربران برای استفاده در حافظه پنهان اشکالی ندارد، توصیه می کنیم به کاربر اجازه دهید این رفتار را از طریق فعالیت تنظیمات خود تغییر دهد.
- فضای دیسک در خودروها متفاوت است، بنابراین به کاربران راهی بدهید تا محتوای آفلاین را حذف کنند، مثلاً از طریق یک گزینه در فعالیت تنظیمات خود.
پشتیبانی از WebView
WebViews در سیستم عامل Android Automotive پشتیبانی میشود اما فقط برای تنظیمات و فعالیتهای ورود به سیستم شما مجاز است. فعالیتهایی که از WebView استفاده میکنند باید در خارج از WebView «بسته» یا «بازگشت» داشته باشند.
در اینجا چند نمونه از موارد استفاده قابل قبول برای WebViews آورده شده است:
- نمایش خط مشی رازداری، شرایط خدمات، یا سایر پیوندهای مرتبط با حقوق در فعالیت تنظیمات شما.
- یک جریان مبتنی بر وب در فعالیت ورود به سیستم شما.
هنگام استفاده از WebView، می توانید جاوا اسکریپت را فعال کنید .
WebView خود را ایمن کنید
تمام اقدامات احتیاطی ممکن را انجام دهید تا مطمئن شوید که WebView شما نقطه ورود به اینترنت بزرگتر نیست. برای مثالی در مورد نحوه قفل کردن WebView روی URL استفاده شده در فراخوانی loadUrl()
و جلوگیری از تغییر مسیر، قطعه کد زیر را ببینید. ما شدیداً توصیه می کنیم که در صورت امکان، مانند نمایش پیوندهای مرتبط با حقوق، اقدامات حفاظتی مانند این را اجرا کنید.
کاتلین
override fun shouldOverrideUrlLoading(webView: WebView, webResourceRequest: WebResourceRequest): Boolean { val originalUri: Uri = Uri.parse(webView.originalUrl) // Check for allowed URLs if (originalUri.equals(Uri.parse(BLANK_URL)) || originalUri.equals(webResourceRequest.url)) { return false } if (webResourceRequest.isRedirect) { logger.w("Redirect detected, not following") return true } setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url) logger.w( String.format( "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri)) return true }
جاوا
@Override public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) { Uri originalUri = Uri.parse(webView.getOriginalUrl()); // Check for allowed URLs if (originalUri.equals(Uri.parse(BLANK_URL)) || originalUri.equals(webResourceRequest.getUrl())) { return false; } if (webResourceRequest.isRedirect()) { logger.w("Redirect detected, not following"); return true; } setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl()); logger.w( String.format( "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri)); return true; }
نام بسته ها
از آنجایی که یک کیت بسته Android (APK) جداگانه برای سیستم عامل Android Automotive توزیع میکنید، میتوانید از نام بسته از برنامه تلفن همراه خود دوباره استفاده کنید یا یک نام بسته جدید ایجاد کنید. اگر از نام بسته دیگری استفاده میکنید، برنامه شما دارای دو فهرست جداگانه در فروشگاه Play است. اگر از نام بسته فعلی خود دوباره استفاده کنید، برنامه شما دارای یک لیست واحد در هر دو پلتفرم است.
این عمدتا یک تصمیم تجاری است. به عنوان مثال، اگر یک تیم دارید که روی برنامه تلفن همراه کار می کند و یک تیم جداگانه روی برنامه سیستم عامل Android Automotive شما کار می کند، ممکن است منطقی باشد که نام بسته های جداگانه داشته باشید و به هر تیم اجازه دهید فهرست فروشگاه Play خود را مدیریت کند. تفاوت زیادی در تلاش فنی مورد نیاز برای استفاده از هر دو روش وجود ندارد.
جدول زیر برخی از تفاوت های کلیدی دیگر بین حفظ نام بسته فعلی و استفاده از نام بسته جدید را خلاصه می کند:
ویژگی | همان نام بسته | نام بسته جدید |
---|---|---|
فهرست فروشگاه | مجرد | چندگانه |
نصب آینه ای | بله: "نصب مجدد سریع برنامه" در طول جادوگر راه اندازی | خیر |
فرآیند بررسی فروشگاه Play | مسدود کردن مرورها: اگر بازبینی برای یک APK ناموفق باشد، سایر APKهای ارسال شده در همان نسخه مسدود میشوند. | بررسی های فردی |
آمار، معیارها و موارد حیاتی | ترکیبی: می توانید داده های خاص خودرو را فیلتر کنید. | جدا کنید |
نمایه سازی و رتبه بندی جستجو | ایجاد کردن ایستاده فعلی | بدون انتقال |
ادغام با سایر برنامه ها | به احتمال زیاد هیچ تغییری لازم نیست، با فرض اینکه کد رسانه بین هر دو APK به اشتراک گذاشته شده است | شاید لازم باشد برنامه مربوطه را بهروزرسانی کنید، مانند پخش URI با دستیار Google. |
سوالات متداول
برای پاسخ به برخی از سوالات متداول درباره سیستم عامل Android Automotive به بخش های زیر مراجعه کنید.
سخت افزار
آیا برنامه من می تواند به میکروفون دسترسی پیدا کند؟
برای برنامههایی که Android 10 (سطح API 29) یا بالاتر را هدف قرار میدهند، به اسناد ورودی صوتی اشتراکگذاری مراجعه کنید. این قبل از سطح API 29 امکان پذیر نیست.
به کدام API خودرو می توانیم دسترسی داشته باشیم و چگونه؟
شما محدود به APIهایی هستید که توسط OEM در معرض دید قرار می گیرند. فرآیندهایی برای استاندارد کردن نحوه دسترسی شما به این APIها در حال توسعه هستند.
برنامه ها می توانند با استفاده از SetProperty()
و GetProperty()
در CarPropertyManager
به API های خودرو دسترسی داشته باشند. برای مشاهده لیستی از تمام ویژگی های موجود به کد منبع یا مستندات مرجع مراجعه کنید. اگر ویژگی با @SystemApi
حاشیه نویسی شده باشد، به برنامه های سیستمی از پیش بارگذاری شده محدود می شود.
چه نوع کدک های صوتی پشتیبانی می شوند؟
به جزئیات کدک صوتی در CDD Android مراجعه کنید.
آیا Widevine DRM پشتیبانی می شود؟
بله. Widevine DRM پشتیبانی می شود.
توسعه و آزمایش
آیا محدودیت یا توصیه ای برای استفاده از SDK ها و کتابخانه های شخص ثالث وجود دارد؟
ما هیچ دستورالعمل خاصی برای استفاده از SDK و کتابخانه های شخص ثالث نداریم. اگر استفاده از SDK ها و کتابخانه های شخص ثالث را انتخاب کنید، همچنان مسئول رعایت تمام الزامات کیفیت برنامه خودرو هستید.
آیا می توانم از خدمات پیش زمینه استفاده کنم؟
تنها مورد مجاز برای یک سرویس پیش زمینه، دانلود محتوا برای استفاده آفلاین است. اگر مورد استفاده دیگری برای سرویس پیش زمینه دارید که میخواهید از آن پشتیبانی کنید، با استفاده از گروه بحث سیستم عامل Android Automotive با ما تماس بگیرید.
انتشار برنامه های سیستم عامل Android Automotive
چگونه برنامه سیستم عامل Android Automotive خود را با استفاده از کنسول Google Play منتشر کنم؟
فرآیند انتشار برنامه مشابه انتشار یک برنامه تلفنی است، اما شما از فاکتور فرم متفاوتی استفاده می کنید. برای انتخاب برنامه خود برای استفاده از عامل فرم سیستم عامل Android Automotive، این مراحل را دنبال کنید:
- کنسول Play را باز کنید.
- برنامه خود را انتخاب کنید.
- از منوی سمت چپ، روی Release > Setup > Advanced settings > Form factor کلیک کنید.
- روی افزودن عامل فرم > سیستمعامل Android Automotive کلیک کنید، سپس دستورالعملهای موجود در Play Console را دنبال کنید.
منابع اضافی
برای کسب اطلاعات بیشتر در مورد سیستم عامل Android Automotive، به منابع اضافی زیر مراجعه کنید.
نمونه ها
راهنماها
- طراحی برای رانندگی
- با استفاده از برنامه تست کنترلر رسانه
- اعلان ها در سیستم عامل Android Automotive
- کیفیت برنامه اندروید برای ماشین
وبلاگ ها
- به روز رسانی سیستم عامل Android Automotive برای توسعه دهندگان
- توسعه برنامه برای سیستم عامل Android Automotive
ویدیوها
- نحوه ساخت برنامه های رسانه ای برای اتومبیل ها (Android Dev Summit '19)
- نحوه ساخت اپلیکیشن اندروید برای خودروها (Google I/O'19)
یک مشکل رسانه سیستم عامل Android Automotive را گزارش کنید
اگر هنگام توسعه برنامه رسانه خود برای سیستم عامل Android Automotive با مشکلی مواجه شدید، میتوانید آن را با استفاده از Google Issue Tracker گزارش دهید. حتماً تمام اطلاعات درخواستی را در قالب شماره پر کنید.
قبل از ثبت یک مشکل جدید، بررسی کنید که آیا قبلاً در لیست مشکلات گزارش شده است یا خیر. میتوانید با کلیک کردن روی ستاره برای مشکلی در ردیاب مشترک شوید و به مسائل رأی دهید. برای اطلاعات بیشتر، به اشتراک در یک مشکل مراجعه کنید.