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

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

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

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

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

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

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

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

إعداد مشروعك

يجب إعداد عدّة أجزاء من مشروع تطبيقك لتفعيل support لنظام التشغيل 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. التطبيق.

<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

Groovy

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:

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

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

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

  • تسجيل الدخول بنقرة واحدة والاشتراك: إذا سبق لك تنفيذ نقرة واحدة على الأجهزة الأخرى، مثل تطبيق الهاتف، عليك تطبيقها تطبيق نظام التشغيل 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() لطلب البحث عقدة الوسائط الجذر. عند حدوث ذلك، يعرض النظام ملء الشاشة. في رسالة الخطأ التي تم ضبطها في PlaybackStateCompat.

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

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

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

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

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

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

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

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

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

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

في ما يلي بعض النقاط التي يجب وضعها في الاعتبار عند محاولة الحصول على الدعم في وضع عدم الاتصال الإستراتيجية:

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

التوافق مع 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;
}

أسماء الحِزم

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

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

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

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

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

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

الأجهزة

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

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

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

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

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

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

راجِع تفاصيل برنامج ترميز الصوت. في Android CDD.

هل برنامج 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 تأكَّد من ملء جميع المعلومات المطلوبة في نموذج المشكلة.

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

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