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

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

مروری بر توسعه

افزودن پشتیبانی از سیستم عامل Android Automotive فقط به چند مرحله نیاز دارد، همانطور که در بخش های زیر توضیح داده شده است:

  1. ویژگی‌های خودرو را در Android Studio فعال کنید .
  2. یک ماژول خودرو ایجاد کنید .
  3. وابستگی های Gradle خود را به روز کنید .
  4. به صورت اختیاری، تنظیمات و فعالیت‌های ورود به سیستم را اجرا کنید .
  5. در صورت تمایل، نکات میزبان رسانه را بخوانید .

ملاحظات طراحی

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

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

پروژه خود را تنظیم کنید

برای فعال کردن پشتیبانی از سیستم عامل Android Automotive، باید چندین بخش از پروژه برنامه خود را تنظیم کنید.

فعال کردن ویژگی‌های خودرو در Android Studio

از Android Studio نسخه 4.0 یا بالاتر برای اطمینان از فعال بودن همه ویژگی‌های Automotive OS استفاده کنید.

یک ماژول خودرو ایجاد کنید

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

برای افزودن یک ماژول خودرو به پروژه خود این مراحل را دنبال کنید:

  1. در Android Studio، روی File > New > New Module کلیک کنید.
  2. Automotive Module را انتخاب کنید، سپس روی Next کلیک کنید.
  3. نام برنامه/کتابخانه را وارد کنید. این نامی است که کاربران برای برنامه شما در سیستم عامل Android Automotive می بینند.
  4. نام ماژول را وارد کنید.
  5. نام بسته را برای مطابقت با برنامه خود تنظیم کنید.
  6. API 28: Android 9.0 (Pie) را برای Minimum SDK انتخاب کنید و سپس روی Next کلیک کنید.

    همه خودروهایی که از سیستم‌عامل Android Automotive پشتیبانی می‌کنند، روی Android 9 (سطح API 28) یا بالاتر اجرا می‌شوند، بنابراین انتخاب این مقدار همه خودروهای سازگار را هدف قرار می‌دهد.

  7. 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 repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

برای اجرای فعالیت خود، مراحل زیر را دنبال کنید:

  1. پوشه automotive/automotive-lib در ماژول automotive خود کپی کنید.
  2. یک درخت ترجیحات را در automotive/src/main/res/xml/preferences.xml تعریف کنید.
  3. یک 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 از آن استفاده نمی‌کنند.

در شروع برنامه باید وارد سیستم شوید

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

  1. در متد onLoadChildren() سرویس شما، با استفاده از روش sendResult() نتیجه null را ارسال کنید.
  2. PlaybackStateCompat جلسه رسانه را با استفاده از متد setState() روی STATE_ERROR تنظیم کنید. این به سیستم‌عامل Android Automotive می‌گوید تا زمانی که خطا برطرف نشود، هیچ عملیات دیگری نمی‌تواند انجام شود.
  3. کد خطای PlaybackStateCompat جلسه رسانه را روی ERROR_CODE_AUTHENTICATION_EXPIRED تنظیم کنید. این به سیستم عامل Android Automotive می گوید که کاربر باید احراز هویت کند.
  4. پیام خطای PlaybackStateCompat جلسه رسانه را با استفاده از متد setErrorMessage() تنظیم کنید. از آنجا که این پیام خطا رو به کاربر است، آن را برای محلی فعلی کاربر بومی سازی کنید.
  5. با استفاده از متد 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 تنظیم کنید:

خطاهای قابل اجرا به صورت 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، این مراحل را دنبال کنید:

  1. کنسول Play را باز کنید.
  2. برنامه خود را انتخاب کنید.
  3. از منوی سمت چپ، روی Release > Setup > Advanced settings > Form factor کلیک کنید.
  4. روی افزودن عامل فرم > سیستم‌عامل Android Automotive کلیک کنید، سپس دستورالعمل‌های موجود در Play Console را دنبال کنید.

منابع اضافی

برای کسب اطلاعات بیشتر در مورد سیستم عامل Android Automotive، به منابع اضافی زیر مراجعه کنید.

نمونه ها

راهنماها

وبلاگ ها

ویدیوها

یک مشکل رسانه سیستم عامل Android Automotive را گزارش کنید

اگر هنگام توسعه برنامه رسانه خود برای سیستم عامل Android Automotive با مشکلی مواجه شدید، می‌توانید آن را با استفاده از Google Issue Tracker گزارش دهید. حتماً تمام اطلاعات درخواستی را در قالب شماره پر کنید.

یک شماره جدید ایجاد کنید

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