إضافة توافق نظام التشغيل Android Automotive إلى تطبيق الوسائط

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

نظرة عامة على التطوير

لا تتطلّب إضافة التطبيق المتوافق مع نظام التشغيل Android Automotive سوى بضع خطوات على النحو الموضَّح. في الأقسام التالية:

  1. تفعيل ميزات السيارات في "استوديو Android"
  2. أنشئ وحدة للسيارات.
  3. تعديل تبعيات Gradle
  4. يمكنك اختياريًا تنفيذ الإعدادات وأنشطة تسجيل الدخول.
  5. يمكنك اختياريًا قراءة تلميحات مضيف الوسائط.

اعتبارات التصميم

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

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

إعداد مشروعك

عليك إعداد عدة أجزاء من مشروع تطبيقك لتفعيل التوافق مع نظام التشغيل Android Automotive.

تفعيل ميزات السيارات في "استوديو Android"

يجب استخدام الإصدار 4.0 من "استوديو Android" أو الإصدارات الأحدث للتأكّد من أنّ جميع ميزات نظام التشغيل Automotive. مفعّلة.

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

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

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

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

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

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

بعد إنشاء الوحدة في "استوديو Android"، افتح 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 intent والفلاتر في ملف البيان.

عادةً ما تستهدف الأنشطة المشابهة في المثال التالي هاتفًا أو بعضًا على جهاز محمول آخر. يجب الإفصاح عن هذه الأنشطة في الوحدة التي تنشئ تطبيق الهاتف، وليس في الوحدة التي تنشئ تطبيق 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')
    }
}

Kotlin

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

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

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

يجب تنفيذ هذه الأنشطة فقط إذا كان تطبيق نظام التشغيل 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 AutomotiveACTION_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، حِزم أدوات كاملة يمكنها مساعدتك في إنشاء تجارب مصادقة مخصّصة. تستفيد الأدوات الأخرى من بيانات اعتماد المستخدم الحالية أو تقنيات أخرى لمساعدتك في توفير تجارب تسجيل دخولسلسة للمستخدمين.

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

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

استخدام مدير الحساب

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

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

الأذونات

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

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

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

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

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

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

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

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

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

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

الأخطاء القابلة للتنفيذ

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

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

اختبار حالات الخطأ

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

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

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

يجب أخذ هذه الاعتبارات الأخرى في الاعتبار عند تطوير نظام Android Automotive. تطبيق نظام التشغيل:

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

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

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

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

التوافق مع WebView

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

في ما يلي بعض الأمثلة على حالات الاستخدام المقبولة لمكوّنات WebView:

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

عند استخدام مكوّن 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 باستخدام Google Play Console؟

تشبه عملية نشر التطبيق عملية نشر تطبيق هاتف، ولكنك تستخدم شكل جهاز مختلفًا. لتفعيل نظام التشغيل Android Automotive في تطبيقك. يعمل الجهاز على شكل نظام التشغيل، اتّبِع الخطوات التالية:

  1. فتح Play Console
  2. اختيار تطبيقك
  3. في القائمة اليمنى، انقر على الإصدار > الإعداد > الإعدادات المتقدمة > أشكال الأجهزة:
  4. انقر على إضافة شكل الجهاز >. Android Automotive، ثم اتّبِع التعليمات الواردة في Play Console.

مصادر إضافية

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

نماذج

الأدلّة

المدوّنات

الفيديوهات

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

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

إنشاء عدد جديد

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