إضافة توافق نظام التشغيل 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

استخدِم الإصدار 4.0 من Android Studio أو إصدار أحدث لضمان تفعيل جميع ميزات نظام التشغيل Automotive.

إنشاء وحدة للسيارات

تفرض بعض مكوّنات نظام التشغيل Android Automotive، مثل البيان، متطلبات خاصة بالنظام الأساسي. أنشئ وحدة يمكنها فصل الرمز البرمجي لهذه المكوّنات عن الرمز البرمجي الآخر في مشروعك، مثل الرمز البرمجي المستخدَم لتطبيق هاتفك.

اتّبِع الخطوات التالية لإضافة وحدة سيارات إلى مشروعك:

  1. في Android Studio، انقر على ملف > جديد > وحدة جديدة.
  2. اختَر وحدة السيارات، ثم انقر على التالي.
  3. أدخِل اسم تطبيق/مكتبة. هذا هو الاسم الذي يظهر للمستخدمين عند تثبيت تطبيقك على نظام التشغيل Android Automotive.
  4. أدخِل اسم الوحدة.
  5. عدِّل اسم الحزمة ليطابق اسم تطبيقك.
  6. اختَر المستوى 28 من واجهة برمجة التطبيقات: Android 9.0 (Pie) الحد الأدنى لحزمة تطوير البرامج (SDK)، ثم انقر على التالي.

    تعمل جميع السيارات المتوافقة مع نظام التشغيل Android Automotive بنظام التشغيل Android 9 (المستوى 28 من واجهة برمجة التطبيقات) أو إصدار أحدث، لذا يؤدي اختيار هذه القيمة إلى استهداف جميع السيارات المتوافقة.

  7. اختَر ما مِن نشاط، ثم انقر على إنهاء.

بعد إنشاء الوحدة في 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.

بعد إضافة أي إعدادات أو أنشطة تسجيل دخول، أكمِل ملف البيان من خلال ضبط سمة 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.

<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')
    }
}

Kotlin

buildscript {
    ...
    dependencies {
        ...
        implementation(project(":shared_module_name"))
    }
}

تنفيذ الإعدادات وأنشطة تسجيل الدخول

بالإضافة إلى خدمة متصفّح الوسائط، يمكنك أيضًا توفير إعدادات وأنشطة تسجيل دخول مُحسَّنة للمركبات لتطبيقك المتوافق مع نظام التشغيل Android Automotive. تسمح لك هذه الأنشطة بتوفير وظائف التطبيق غير المضمّنة في IDEAndroid Media APIs.

لا تنفِّذ هذه الأنشطة إلا إذا كان تطبيقك المتوافق مع نظام التشغيل Android Automotive يحتاج إلى السماح للمستخدمين بتسجيل الدخول أو تحديد إعدادات التطبيق. لا يستخدم Android Auto هذه الأنشطة.

مهام سير العمل المتعلّقة بالأنشطة

يوضِّح الرسم البياني التالي كيفية تفاعل المستخدم مع إعداداتك و أنشطة تسجيل الدخول باستخدام نظام التشغيل Android Automotive:

سير العمل لأنشطة &quot;الإعدادات&quot; و&quot;تسجيل الدخول&quot;

الشكل 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 الذي يطلب من تطبيقك بدء نشاط الإعدادات.

توضِّح بقية أقسام هذا القسم كيفية تعديل الرمز البرمجي من نموذج تطبيق Universal Android Music Player (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 إلى وحدة السيارات.
  2. حدِّد شجرة الإعدادات المفضّلة كما هو موضّح في المثال التالي: automotive/src/main/res/xml/preferences.xml.
  3. نفِّذ PreferenceFragmentCompat يعرضه نشاط الإعدادات. اطّلِع على الملفَّين SettingsFragment.kt و SettingsActivity.kt في UAMP ودليل إعدادات Android للحصول على مزيد من المعلومات.

أثناء تنفيذ نشاط الإعدادات، ننصحك باتّباع أفضل الممارسات التالية لاستخدام بعض المكوّنات في مكتبة الإعدادات المفضّلة:

  • لا تتضمن أكثر من مستويَين من التعمّق أسفل العرض الرئيسي في نشاط الإعدادات.
  • لا تستخدِم DropDownPreference. استخدِم ListPreference بدلاً من ذلك.
  • المكوّنات التنظيمية:
    • PreferenceScreen
      • يجب أن يكون هذا هو المستوى الأعلى من شجرة الإعدادات المفضّلة.
    • PreferenceCategory
      • تُستخدَم هذه السمة لتجميع عناصر Preference معًا.
      • أدرِج title.
  • أدرِج key وtitle في جميع المكوّنات التالية. يمكنك أيضًا تضمين summary أو icon أو كليهما:
    • Preference
      • خصِّص المنطق في دالة onPreferenceTreeClick() التي تستدعي PreferenceFragmentCompat.
    • CheckBoxPreference
      • يمكن أن يتضمّن summaryOn أو summaryOff بدلاً من summary للنص الشَرطي.
    • SwitchPreference
      • يمكن أن يتضمّن summaryOn أو summaryOff بدلاً من summary للنص الشَرطي.
      • يمكن أن يتضمّن 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() لخدمتك، أرسِل نتيجة null باستخدام الطريقة sendResult().
  2. اضبط PlaybackStateCompat لجلسة الوسائط على STATE_ERROR باستخدام الطريقة setState(). يُعلم هذا الإجراء نظام التشغيل Android Automotive بأنّه لا يمكن تنفيذ أي عمليات أخرى إلى أن يتم حلّ الخطأ.
  3. اضبط PlaybackStateCompat رمز الخطأ لجلسة الوسائط على ERROR_CODE_AUTHENTICATION_EXPIRED. يُعلم هذا الإجراء نظام التشغيل Android Automotive بأنّ المستخدم بحاجة إلى المصادقة.
  4. اضبط PlaybackStateCompat رسالة الخطأ لجلسة الوسائط باستخدام الطريقة setErrorMessage(). بما أنّ رسالة الخطأ هذه موجّهة للمستخدم، عليك ترجمة محتواها للغة التي يستخدمها المستخدم حاليًا.
  5. اضبط PlaybackStateCompat الإضافات لجلسة الوسائط باستخدام الطريقة setExtras(). أدرِج المفتاحَين التاليَين:

يوضّح المقتطف التالي من الرمز البرمجي كيفية مطالبة تطبيقك للمستخدم بتسجيل الدخول قبل استخدام التطبيق:

Kotlin

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)

Java

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، ثم أعِد المستخدم إلى نظام التشغيل Android Automotive من خلال استدعاء finish() طريقة النشاط.

تنفيذ نشاط تسجيل الدخول

تقدّم Google مجموعة متنوعة من أدوات تحديد الهوية التي يمكنك استخدامها لمساعدة المستخدمين في تسجيل الدخول إلى تطبيقك في سياراتهم. توفّر بعض الأدوات، مثل Firebase Authentication، حِزم أدوات كاملة يمكنها مساعدتك في إنشاء تجارب مصادقة مخصّصة. تستفيد الأدوات الأخرى من بيانات اعتماد المستخدم الحالية أو تقنيات أخرى لمساعدتك في توفير تجارب تسجيل دخول سلسة للمستخدمين.

يمكن أن تساعدك الأدوات التالية في توفير تجربة تسجيل دخول أسهل للمستخدمين الذين سجّلوا الدخول من قبل على جهاز آخر:

  • تسجيل الدخول والاشتراك بنقرة واحدة: إذا سبق لك استخدام ميزة One Tap على الأجهزة الأخرى، مثل تطبيق الهاتف، يمكنك استخدامها في تطبيق Android Automotive OS ليتمكّن مستخدمو ميزة One Tap الحالية من الاستفادة منها.
  • تسجيل الدخول باستخدام حساب Google: إذا سبق لك استخدام ميزة تسجيل الدخول باستخدام حساب Google على أجهزة أخرى، مثل تطبيق الهاتف، يمكنك استخدام ميزة تسجيل الدخول باستخدام حساب Google على تطبيق Android Automotive OS لتفعيل هذه الميزة لمستخدمي التطبيق الحاليين.
  • الملء التلقائي من Google: إذا فعّل المستخدمون ميزة "الملء التلقائي من Google" على أجهزتهم الأخرى التي تعمل بنظام التشغيل Android، يتم حفظ بيانات اعتمادهم في مدير كلمات المرور في Google. وعندما يسجّل هؤلاء المستخدمون الدخول إلى تطبيقك المتوافق مع نظام التشغيل Android Automotive، تقترح ميزة "الملء التلقائي من Google" بيانات الاعتماد المحفوظة ذات الصلة. لا يتطلّب استخدام ميزة "الملء التلقائي من Google" أي جهد لتطوير التطبيقات. ومع ذلك، يمكن لمطوّري التطبيقات تحسين تطبيقاتهم للحصول على نتائج ذات جودة أعلى. تتوفّر ميزة "الملء التلقائي من Google" على جميع الأجهزة التي تعمل بالإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، بما في ذلك نظام التشغيل Android Automotive.

استخدام AccountManager

يجب أن تستخدم التطبيقات التي تعمل بنظام التشغيل Android Automotive والتي تتضمّن عملية مصادقة فئة برمجة التطبيقات AccountManager، وذلك للأسباب التالية:

  • تجربة مستخدم أفضل وسهولة إدارة الحسابات: يمكن للمستخدمين إدارة كل حساباتهم بسهولة من قائمة الحسابات في إعدادات النظام، بما في ذلك تسجيل الدخول وتسجيل الخروج.
  • تجارب"الضيف": السيارات هي أجهزة مشترَكة، ما يعني أنّ المصنّعين الأصليين للسيارات يمكنهم تفعيل تجارب "الضيف" في المركبة، حيث لا يمكن إضافة حسابات. يتم تطبيق هذا القيود باستخدام DISALLOW_MODIFY_ACCOUNTS لـ AccountManager.

الأذونات

إذا كنت بحاجة إلى طلب أذونات من المستخدم، استخدِم المسار نفسه المستخدَم في نشاط المصادقة أو نشاط الإعدادات في مخطّط تدفقات عمل النشاط المعروض في قسم سابق.

قراءة تلميحات مضيف الوسائط

استنادًا إلى تطبيق النظام (بما في ذلك إصداره) الذي يتصل بخدمة متصفّح الوسائط، قد يتلقّى تطبيقك الإضافات التالية:

خطأ أثناء المعالجة

يتم إرسال الأخطاء في تطبيقات الوسائط على نظام التشغيل Android Automotive من خلال PlaybackStateCompat جلسة الوسائط. بالنسبة إلى جميع الأخطاء، يجب ضبط رمز خطأ مناسب ورسالة خطأ في PlaybackStateCompat. يؤدي ذلك إلى ظهور Toast في واجهة المستخدم.

عند حدوث خطأ ولكن يمكن مواصلة التشغيل، يمكنك إصدار خطأ غير قاتل. على سبيل المثال، قد يتمكّن المستخدم من تشغيل الموسيقى في تطبيق قبل تسجيل الدخول، ولكن يجب تسجيل الدخول قبل أن يتمكّن من تخطّي أغنية. عند استخدام خطأ غير قاتل، يمكن للنظام أن يقترح على المستخدم تسجيل الدخول بدون إيقاف تشغيل الوسائط الحالية.

عند إصدار خطأ غير مميت، احتفظ ببقية PlaybackStateCompat كما هي، باستثناء رمز الخطأ ورسالة الخطأ. يتيح استخدام هذا الأسلوب مواصلة تشغيل ملف الوسائط الحالي بينما يقرر المستخدم ما إذا كان يريد تسجيل الدخول.

عندما لا يكون التشغيل ممكنًا، مثلاً في حال عدم توفّر اتصال بالإنترنت وعدم توفّر محتوى بلا إنترنت، اضبط حالة PlaybackStateCompat على STATE_ERROR.

عند إجراء تعديلات لاحقة على PlaybackStateCompat، عليك محو أي رموز أخطاء ورسائل أخطاء لتجنّب عرض تحذيرات متعددة للخطأ نفسه.

إذا تعذّر عليك تحميل شجرة تصفّح في أي وقت، على سبيل المثال، إذا كانت تتطلّب المصادقة ولم يسجِّل المستخدم الدخول، أرسِل شجرة تصفّح خالية. للإشارة إلى ذلك، يجب عرض نتيجة فارغة من onLoadChildren() لnode الوسائط الجذر. وعندما يحدث ذلك، يعرض النظام شاشة خطأ كاملة مع رسالة الخطأ التي تم ضبطها في PlaybackStateCompat.

الأخطاء التي يمكن معالجتها

إذا كان الخطأ قابلاً للتنفيذ، يمكنك أيضًا ضبط المَعلمتَين الإضافيتَين التاليتَين في ملف PlaybackStateCompat:

تظهر الأخطاء التي يمكن اتّخاذ إجراء بشأنها على شكل Dialog ولا يمكن للمستخدمين حلّها إلا عند إيقاف السيارة.

حالات الأخطاء في الاختبار

تأكَّد من أنّ تطبيقك يعالج الأخطاء بشكل سلس في جميع السيناريوهات، بما في ذلك:

  • المستويات المختلفة لمنتجك: على سبيل المثال، الإصدار المجاني مقارنةً بالإصدار المدفوع أو الإصدار المتوفر عند تسجيل الدخول مقارنةً بالإصدار المتوفر عند تسجيل الخروج
  • حالات القيادة المختلفة: على سبيل المثال، حالة الركن مقابل حالة القيادة
  • حالات الاتصال المختلفة: على سبيل المثال، الاتصال بالإنترنت مقابل عدم الاتصال بالإنترنت

اعتبارات أخرى

يُرجى مراعاة الاعتبارات الأخرى التالية عند تطوير تطبيقك المتوافق مع نظام التشغيل Android Automotive OS:

المحتوى بلا إنترنت

وفِّر إمكانية التشغيل بلا إنترنت، إن أمكن. من المتوقّع أن تتضمّن السيارات التي تعمل بنظام التشغيل Android Auto اتصالات بيانات خاصة بها، ما يعني أنّه يتم تضمين خطة data في تكلفة المركبة أو يدفع المستخدم ثمنها. ومع ذلك، من المتوقّع أيضًا أن تتضمّن السيارات اتصالاً متبدّلاً أكثر من الأجهزة الجوّالة.

في ما يلي بعض الأمور التي يجب وضعها في الاعتبار عند التفكير في استراتيجية المساعدة بلا إنترنت:

  • إنّ أفضل وقت لتنزيل المحتوى هو عندما يكون تطبيقك قيد الاستخدام.
  • لا تفترض توفّر شبكة Wi-Fi. قد لا تصل السيارة أبدًا إلى نطاق شبكة Wi-Fi، أو قد يكون المصنّع الأصلي للسيارة قد أوقف شبكة Wi-Fi لصالح شبكة الجوّال.
  • على الرغم من أنّه من المقبول تخزين المحتوى الذي يتوقع المستخدمون استخدامه في ذاكرة التخزين المؤقت بذكاء، ننصحك بالسماح للمستخدم بتغيير هذا السلوك من خلال نشاط الإعدادات.
  • تختلف مساحة القرص في السيارات، لذا امنح المستخدمين طريقة لحذف المحتوى بلا إنترنت، مثلاً من خلال خيار في نشاط الإعدادات.

توافق WebView

تتوفّر WebViews في نظام التشغيل Android Automotive، ولكن لا يُسمح باستخدامها إلا في إعداداتك وأنشطة تسجيل الدخول. يجب أن تتضمّن الأنشطة التي تستخدم WebView ميزة "إغلاق" أو "رجوع" خارج WebView.

في ما يلي بعض الأمثلة على حالات الاستخدام المقبولة لـ WebViews:

  • عرض سياسة الخصوصية أو بنود الخدمة أو روابط أخرى ذات صلة بالقانون في نشاط الإعدادات
  • عملية تسجيل دخول مستندة إلى الويب في نشاطك

عند استخدام WebView، يمكنك تفعيل JavaScript.

تأمين WebView

اتّخِذ كل الاحتياطات الممكنة للمساعدة في التأكّد من أنّ WebView ليس نقطة دخول إلى الإنترنت بشكل عام. اطّلِع على مقتطف الرمز التالي للحصول على مثال على كيفية قفل WebView على عنوان URL المستخدَم في loadUrl() طلب منع عمليات إعادة التوجيه. ننصحك بشدة بتنفيذ إجراءات وقائية مماثلة عند الإمكان، مثل عرض روابط تتعلّق بالمسائل القانونية.

Kotlin

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
}

Java

@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 Package Kit (APK) منفصلة لنظام التشغيل Android Automotive، يمكنك مجددًا استخدام اسم الحزمة من تطبيقك المتوافق مع الأجهزة الجوّالة أو إنشاء اسم حزمة جديد. إذا كنت تستخدم اسم حزمة مختلفًا، سيتضمّن تطبيقك قائمتَين منفصلتَين في "متجر Play". في حال إعادة استخدام اسم الحزمة الحالي، سيتوفّر لتطبيقك بطاقة بيانات متجر واحدة على كلتا المنصّتَين.

يعود هذا القرار بشكل أساسي إلى النشاط التجاري. على سبيل المثال، إذا كان لديك فريق واحد يعمل على تطوير التطبيق المتوافق مع الأجهزة الجوّالة، وفريق منفصل يعمل على تطوير تطبيق نظام التشغيل Android Automotive، قد يكون من المنطقي استخدام أسماء حِزم منفصلة والسماح لكل فريق بإدارة بطاقة بياناته الخاصة على "متجر Play". ليس هناك فرق كبير في الجهد الفني المطلوب لاستخدام أي من الطريقتَين.

يلخِّص الجدول التالي بعض الاختلافات الرئيسية الأخرى بين الاحتفاظ باسم الحزمة الحالي واستخدام اسم حزمة جديد:

الميزة اسم الحزمة نفسه اسم الحزمة الجديد
بطاقة بيانات المتجر فردية عدة تعليقات
التثبيت المطابق نعم: "إعادة تثبيت التطبيقات بسرعة" أثناء معالج الإعداد لا
عملية المراجعة في "متجر Play" حظر المراجعات: إذا تعذّر اجتياز المراجعة لحزمة APK واحدة، سيتم حظر حِزم APK الأخرى التي تم إرسالها في الإصدار نفسه. المراجعات الفردية
الإحصاءات والمقاييس والمؤشرات الحيوية البيانات المجمّعة: يمكنك الفلترة للوصول إلى البيانات المتعلّقة بالسيارات. فصل
الفهرسة والترتيب في نتائج البحث الاستفادة من الترتيب الحالي لا يمكن نقل المحتوى
الدمج مع تطبيقات أخرى من المرجّح عدم الحاجة إلى إجراء أي تغييرات، بافتراض أنّ رمز الوسائط مشترَك بين حِزم APK. قد يكون عليك تحديث التطبيق المقابل، مثلاً لتشغيل معرّف الموارد المنتظم (URI) باستخدام "مساعد Google".

الأسئلة الشائعة

اطّلِع على الأقسام التالية للحصول على إجابات عن بعض الأسئلة الشائعة حول نظام التشغيل Android Automotive.

الأجهزة

هل يمكن لتطبيقي الوصول إلى الميكروفون؟

بالنسبة إلى التطبيقات التي تستهدف الإصدار 10 من Android (المستوى 29 لواجهة برمجة التطبيقات) أو إصدارًا أحدث، يُرجى الرجوع إلى مستندات مشاركة إدخال الصوت. ولا يمكن تنفيذ ذلك قبل مستوى واجهة برمجة التطبيقات 29.

ما هي واجهات برمجة تطبيقات السيارات التي يمكننا الوصول إليها وكيف يمكننا ذلك؟

تقتصر على واجهات برمجة التطبيقات التي يعرضها المصنّع الأصلي للجهاز. يتم حاليًا تطوير عمليات لتوحيد طريقة الوصول إلى واجهات برمجة التطبيقات هذه.

يمكن للتطبيقات الوصول إلى واجهات برمجة تطبيقات السيارات باستخدام SetProperty() وGetProperty() في CarPropertyManager. يُرجى الرجوع إلى الرمز المصدر أو المستندات المرجعية للاطّلاع على قائمة بكل المواقع المتاحة. إذا تم توضيح السمة باستخدام @SystemApi، تقتصر على تطبيقات النظام المحمَّلة مسبقًا.

ما هي أنواع برامج ترميز الصوت المتوافقة؟

يُرجى الرجوع إلى تفاصيل برنامج ترميز الصوت في CDD لنظام التشغيل Android.

هل يتوافق مع Widevine DRM؟

نعم. Widevine DRM متوافق.

التطوير والاختبار

هل هناك أي قيود أو اقتراحات لاستخدام حِزم SDK والمكتبات التابعة لجهات خارجية؟

ليس لدينا أي إرشادات محدّدة حول استخدام حِزم SDK والمكتبات التابعة لجهات خارجية. إذا اخترت استخدام حِزم SDK والمكتبات التابعة لجهات خارجية، تظل مسؤولاً عن الامتثال لجميع متطلبات جودة تطبيقات السيارات.

هل يمكنني استخدام خدمة تعمل في المقدّمة؟

إنّ حالة الاستخدام المسموح بها الوحيدة للخدمة التي تعمل في المقدّمة هي تنزيل المحتوى بهدف استخدامه بلا إنترنت. إذا كان لديك حالة استخدام أخرى لخدمة تعمل في المقدّمة تريد أن تتوفر لها إمكانية الاستخدام، يُرجى التواصل معنا باستخدام مجموعة مناقشة نظام التشغيل Android Automotive.

نشر تطبيقات نظام التشغيل Android Automotive

كيف يمكنني نشر تطبيق Android Automotive OS باستخدام Google Play Console؟

لمعرفة تفاصيل حول كيفية نشر تطبيقك المتوافق مع نظام التشغيل Android Automotive باستخدام Google Play Console، يُرجى الاطّلاع على مقالة التوزيع على السيارات.

مصادر إضافية

لمزيد من المعلومات حول نظام التشغيل Android Automotive، يُرجى الاطّلاع على المراجع التالية المُكمّلة.

نماذج

الأدلّة

المدوّنات

الفيديوهات

الإبلاغ عن مشكلة في الوسائط في نظام التشغيل Android Automotive

إذا واجهت مشكلة أثناء تطوير تطبيق الوسائط لنظام التشغيل Android Automotive ، يمكنك الإبلاغ عنها باستخدام أداة تتبُّع المشاكل من Google. احرص على ملء جميع المعلومات المطلوبة في نموذج المشكلة.

إنشاء مشكلة جديدة

قبل الإبلاغ عن مشكلة جديدة، يُرجى التحقّق ممّا إذا تم الإبلاغ عنها من قبل في قائمة الصعوبات. يمكنك الاشتراك في المشاكل والتصويت لها من خلال النقر على النجمة الخاصة بالمشكلة في أداة التتبّع. لمزيد من المعلومات، يُرجى الاطّلاع على الاشتراك في مشكلة.