הוספת תמיכה ב-Android Automotive OS לאפליקציית המדיה

מערכת ההפעלה Android Automotive OS מאפשרת למשתמשים להתקין אפליקציות במכונית. כדי להגיע אל משתמשים בפלטפורמה הזו, צריך להפיץ אפליקציה מותאמת לנהגים תואם ל-Android Automotive OS. אפשר להשתמש כמעט בכל הקוד במשאבים באפליקציית Android Auto, אבל צריך ליצור גרסת build נפרדת עומד בדרישות שמפורטות בדף הזה.

סקירה כללית על הפיתוח

כדי להוסיף תמיכה ב-Android Automotive OS, צריך רק כמה שלבים, כפי שמתואר בסעיפים הבאים:

  1. מפעילים את התכונות לכלי רכב ב-Android Studio.
  2. יצירת מודול לכלי רכב
  3. לעדכן את יחסי התלות של Gradle.
  4. לחלופין, אפשר ליישם הגדרות ופעילויות כניסה.
  5. אפשר גם לקרוא טיפים למארחי מדיה.

שיקולים לגבי התכנון

מערכת Android Automotive OS אחראית על הפריסה של תוכן המדיה שהיא מקבלת משירות דפדפן המדיה של האפליקציה. המשמעות היא שהאפליקציה לא משרטטת את ממשק המשתמש ולא מפעילה אף את הפעילויות שלכם כשמשתמש מפעיל הפעלת מדיה.

אם אתם מטמיעים הגדרות או פעילויות כניסה, הפעילויות האלה חייבות להיות מותאמות לרכב. אפשר לעיין בהנחיות לעיצוב עבור Android Automotive OS במהלך עיצוב האזורים האלה באפליקציה.

הגדרת הפרויקט

עליך להגדיר מספר חלקים בפרויקט של האפליקציה כדי להפעיל תמיכה ב-Android Automotive OS.

הפעלת תכונות לכלי רכב ב-Android Studio

יש להשתמש ב-Android Studio 4.0 ואילך כדי לוודא שכל התכונות של Automotive OS מופעל.

יצירת מודול לכלי רכב

רכיבים מסוימים של Android Automotive OS, כמו המניפסט, כוללים דרישות ספציפיות לפלטפורמה. ליצור מודול שיכול לשמור לרכיבים האלה בנפרד מקוד אחר בפרויקט, כמו את הקוד שמשמש את אפליקציית הטלפון.

כדי להוסיף מודול לכלי רכב לפרויקט:

  1. ב-Android Studio, לוחצים על קובץ > חדש > מודול חדש.
  2. בוחרים באפשרות מודול לרכב ולוחצים על הבא.
  3. מזינים שם אפליקציה/ספרייה. זה השם שהמשתמשים רואים לאפליקציה שלך ב-Android Automotive OS.
  4. מזינים שם למערך.
  5. משנים את שם החבילה בהתאם לאפליקציה.
  6. בוחרים באפשרות API 28: Android 9.0 (Pie) בשדה Minimum SDK, ואז לוחצים על Next.

    כל המכוניות שתומכות ב-Android Automotive OS פועלות ב-Android 9 (רמת API 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 OS. שימו לב שיש אינן פעילויות מוצהרות במניפסט.

אם מטמיעים הגדרות או פעילויות כניסה, צריך להוסיף כאן. המערכת מפעילה את הפעילויות האלה באמצעות כוונות מפורשות ואלו הפעילויות היחידות שאתם מצהירים עליהן במניפסט של אפליקציית 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 OS.

הצהרה על תמיכה במדיה ב-Android Automotive OS

צריך להשתמש ברשומת המניפסט הבאה כדי להצהיר שהאפליקציה שלך תומכת מערכת ההפעלה 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>

מסנני Intent

מערכת Android Automotive OS משתמשת בכוונות מפורשות כדי להפעיל פעילויות במדיה שלך אפליקציה. אין לכלול פעילויות שכוללות 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 OS. הפעילויות האלה מאפשרות לך לספק תכונות של האפליקציה שלא נכללות ממשקי API של Android Media.

כדאי להטמיע את הפעילויות האלה רק אם האפליקציה שלכם ל-Android Automotive OS צריכה לאפשר למשתמשים להיכנס לחשבון או לציין את הגדרות האפליקציה. מערכת Android Auto לא משתמשת בפעילויות האלה.

תהליכי עבודה לפעילויות

בתרשים הבא מוצג האופן שבו משתמש מקיים אינטראקציה עם ההגדרות שלכם פעילויות כניסה באמצעות Android Automotive OS:

תהליכי עבודה להגדרות ולפעילויות של כניסה לחשבון

איור 1. הגדרות ותהליכי הכניסה לפעילות.

מניעת הסחות דעת בהגדרות ובכניסה לחשבון

כדי לוודא שההגדרות ו/או פעילויות הכניסה שלך זמינות רק לשימוש בזמן שהרכב של המשתמש בהמתנה, צריך לאמת שהרכיבים <activity> לא כוללים את הרכיב <meta-data> הבא. האפליקציה תידחה במהלך הבדיקה אם רכיב כזה קיים.

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

הוספת פעילות של הגדרות

אפשר להוסיף פעילות בהגדרות שמותאמת לרכב כדי שהמשתמשים יכולים לקבוע הגדרות לאפליקציה שלך ברכב. ההגדרות שלך היא יכולה לספק גם תהליכי עבודה אחרים, כמו כניסה לחשבון או יציאה ממנו או מעבר בין חשבונות משתמשים. חשוב לזכור שהפעילות הזו מופעלת רק על ידי אפליקציה שפועלת ב-Android Automotive OS. אפליקציות הטלפון שמחוברות אל 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 OS מזהה פעילות הגדרות שהצהרת עליה במחיר מינימלי, כמו סמל. המשתמש יכול להקיש או לבחור בעלות הזאת באמצעות מסך הרכב כדי לנווט לפעילות. מערכת Android Automotive OS שולחת את ACTION_APPLICATION_PREFERENCES Intent שאומר לאפליקציה להתחיל את הפעילות בהגדרות.

בהמשך החלק הזה נסביר איך ניתן לשנות את הקוד מתוך אפליקציה לדוגמה של 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
      • להתאים אישית את הלוגיקה בקריאה החוזרת (callback) של 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 OS שלא ניתן לבצע פעולות אחרות עד השגיאה נפתרה.
  3. הגדרת PlaybackStateCompat של סשן המדיה קוד שגיאה ל-ERROR_CODE_AUTHENTICATION_EXPIRED. הפעולה הזו מנחה את Android Automotive OS שהמשתמש צריך לבצע אימות.
  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 OS על ידי קריאה finish() .

יישום פעילות הכניסה שלך

Google מציעה מגוון כלים לזיהוי שיעזרו לכם לעזור למשתמשים להיכנס לאפליקציה שלכם ברכב. כלים מסוימים, כמו אימות ב-Firebase, מספקים ערכות כלים מלאות שיכולות לעזור לכם ליצור חוויות אימות בהתאמה אישית. שימוש בכלים אחרים פרטי הכניסה הקיימים או טכנולוגיות אחרות של המשתמש, כדי לאפשר לך ליצור באופן חלק של המשתמשים שלנו.

בעזרת הכלים הבאים תוכלו ליצור חוויית כניסה קלה יותר למשתמשים שכבר נכנסו בעבר במכשיר אחר:

  • כניסה והרשמה בהקשה אחת: אם כבר הטמעתם את התכונה One Tap במכשירים אחרים, כמו האפליקציה לטלפון, מטמיעים אותו אפליקציית Android Automotive OS לתמיכה במשתמשים קיימים ב-One Tap.
  • כניסה באמצעות חשבון Google: אם כבר הטמעתם כניסה באמצעות חשבון Google במכשירים אחרים, כמו האפליקציה לטלפון, מטמיעים את כדי לתמוך ב'כניסה באמצעות חשבון Google' קיימת, צריך להיכנס לחשבון באפליקציה ל-Android Automotive OS משתמשים.
  • מילוי אוטומטי של Google: אם המשתמשים הפעילו את האפשרות 'מילוי אוטומטי של Google' במכשירי Android האחרים, פרטי הכניסה שלהם נשמרים במנהל הסיסמאות של Google. כשמשתמשים האלה נכנסים לאפליקציה ל-Android Automotive OS, המילוי האוטומטי עם Google מציעה פרטי כניסה שמורים רלוונטיים. השימוש במילוי אוטומטי של Google מחייב ללא מאמץ לפיתוח אפליקציות. עם זאת, מפתחי אפליקציות יכולים לבצע אופטימיזציה של האפליקציות שלהם כדי לשפר את איכות התוצאות. המילוי האוטומטי של Google נתמך בכל המכשירים עם Android 8.0 (רמת API 26) ואילך, כולל Android Automotive OS.

שימוש במנהל החשבון

באפליקציות ל-Android Automotive OS שיש להן אימות חובה להשתמש AccountManager, מהסיבות הבאות:

  • חוויית משתמש משופרת וניהול קל יותר של החשבונות: המשתמשים יכולים לנהל בקלות את כל החשבונות שלהם מתפריט החשבונות בהגדרות המערכת, כולל כניסה לחשבון ויציאה ממנו.
  • 'אורח' חוויות משתמש: מכוניות הן מכשירים משותפים, ולכן יצרני ציוד מקורי יכולים להפעיל "אורח" בחוויות ברכב, שבהן אי אפשר להוסיף חשבונות. הזה חלה הגבלה באמצעות DISALLOW_MODIFY_ACCOUNTS למשך AccountManager.

הרשאות

אם אתם צריכים לבקש הרשאות מהמשתמש, מבצעים את אותו התהליך כמו פעילות אימות או פעילות ההגדרות בתהליכי העבודה של הפעילות של הדיאגרמה שמוצגת בקטע הקודם.

קריאת הטיפים למארחי המדיה

בהתאם לאפליקציית המערכת (כולל הגרסה שלה) שמתחברת אל שירות דפדפן המדיה שלך, האפליקציה עשויה לקבל את התוספות הבאות:

טיפול בשגיאות

שגיאות באפליקציות מדיה ב-Android Automotive OS מועברות למדיה PlaybackStateCompat של הסשן. צריך להגדיר שגיאה מתאימה לכל השגיאות קוד והודעת שגיאה בPlaybackStateCompat. פעולה זו תגרום להצגת Toast בממשק המשתמש.

אם מתרחשת שגיאה אך ההפעלה יכולה להמשיך, צור שגיאה לא חמורה שגיאה. לדוגמה, ייתכן שמשתמש יוכל להשמיע מוזיקה באפליקציה לפני הכניסה לחשבון, אבל הם חייבים להיכנס לחשבון לפני שהם יכולים לדלג על שיר. אם משתמשים בשגיאה לא חמורה, המערכת יכולה להציע למשתמש להתחבר בלי להפריע להפעלה למשך קובץ המדיה הנוכחי.

אם אתם מציגים שגיאה לא חמורה, שמרו את שאר PlaybackStateCompat כפי שהם, מלבד קוד השגיאה והודעת השגיאה. הגישה הזו מאפשרת להמשיך את ההפעלה של פריט המדיה הנוכחי בזמן שהמשתמש מחליט אם להיכנס לחשבון.

כשאי אפשר להפעיל את הסרטון, למשל כשאין חיבור לאינטרנט אין תוכן במצב אופליין, צריך להגדיר את המצב PlaybackStateCompat לערך STATE_ERROR.

בעדכונים הבאים של PlaybackStateCompat, צריך לנקות את קודי השגיאה והודעות שגיאה, כדי להימנע מהצגת אזהרות מרובות לגבי אותה שגיאה.

אם בשלב כלשהו לא ניתן לטעון עץ ניווט – לדוגמה, אם נדרש אימות והמשתמש לא נכנס לחשבון – שולחים עץ ניווט ריק. כדי לציין זאת, צריך להחזיר תוצאה null מ-onLoadChildren() עבור צומת המדיה ברמה הבסיסית. במקרה כזה, המערכת מציגה מסך מלא עם הודעת השגיאה שהוגדרה ב-PlaybackStateCompat.

שגיאות פרקטיות

אם יש שגיאה מעשית, צריך להגדיר בנוסף את שתי התוספות הבאות בשדה PlaybackStateCompat:

שגיאות שמאפשרות פעולה מופיעות בתור Dialog והמשתמשים יכולים לתקן אותן רק אם הרכב עומד.

בדיקה של מקרי שגיאות

צריך לוודא שהאפליקציה מטפלת בשגיאות בצורה חלקה בכל התרחישים, כולל:

  • רמות שונות של המוצר: לדוגמה, קישור חינם לעומת פרימיום או משתמש עם חיבור לחשבון לעומת לא מחוברים לחשבון
  • מצבי נסיעה שונים:לדוגמה, 'חניה' לעומת 'נהיגה'
  • מצבי קישוריות שונים: לדוגמה, אופליין או אונליין

שיקולים אחרים

כדאי להביא בחשבון את השיקולים הבאים כשאתם מפתחים אפליקציה ל-Android Automotive OS:

תוכן במצב אופליין

אם רלוונטי, מטמיעים תמיכה בהפעלה במצב אופליין. מכוניות עם Android Automotive למערכת ההפעלה צריכה להיות קישוריות נתונים משלה, כלומר חבילת הגלישה כלולה בעלות הרכב או שהיא משלמת על המשתמש. עם זאת, גם קישוריות של מכוניות צפויה להיות שונה מזו של רכבים ניידים מכשירים.

כמה דברים שחשוב לזכור כששוקלים לקבל תמיכה אופליין אסטרטגיה:

  • הזמן הכי טוב להוריד תוכן הוא בזמן שהאפליקציה בשימוש.
  • אל תניח שה-Wi-Fi זמין. יכול להיות שמעולם לא תגיעו עם הרכב לטווח של רשת Wi-Fi, או שהיצרן המקורי של הרכב השבית את ה-Wi-Fi לטובת רשת סלולרית.
  • זה בסדר לשמור בצורה חכמה במטמון את התוכן שמצפה מהמשתמשים להשתמש בו, אנחנו ממליצים לאפשר למשתמש לשנות את ההתנהגות הזו באמצעות פעילות ההגדרות שלכם.
  • נפח האחסון במכוניות משתנה, לכן צריך לתת למשתמשים אפשרות למחוק תוכן שזמין אופליין, למשל דרך אפשרות פעילות בהגדרות.

תמיכה ב-WebView

יש תמיכה ברכיבי WebView ב-Android Automotive OS, אבל מותר להשתמש בהם רק ההגדרות ופעילויות הכניסה שלך. פעילויות שמשתמשות ב-WebView חייבות לכלול "סגירה" או 'back' במחיר נוח מחוץ ל-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 נפרדת (APK) ל-Android Automotive OS, תוכלו לעשות שימוש חוזר בשם החבילה מהאפליקציה לנייד או ליצור שם חבילה חדש. אם שם החבילה שונה, לאפליקציה יש שתי חנויות Play נפרדות שלך. אם שם החבילה הנוכחי משמש אותך שוב, לאפליקציה שלך יש דף אפליקציה אחד בשתי הפלטפורמות.

בעיקרון זוהי החלטה עסקית. לדוגמה, אם יש לך צוות אחד שעובד את האפליקציה לנייד, וצוות נפרד שעובד על Android Automotive אז אולי כדאי להשתמש בשמות נפרדים של חבילות, לנהל דף אפליקציה משלו בחנות Play. אין הבדל גדול נדרש מאמץ טכני לשימוש בכל אחת מהשיטות.

הטבלה הבאה מסכמת כמה הבדלים חשובים נוספים בין שמירה על שם החבילה הנוכחי ושימוש בשם חבילה חדש:

תכונה שם חבילה זהה שם החבילה החדש
רישום חנות יחיד מספר תגובות
התקנה משוכפלת כן: "התקנה מהירה של האפליקציה מחדש" במהלך אשף ההגדרה לא
תהליך הבדיקה של חנות Play חסימת ביקורות: אם הבדיקה נכשלה לגבי APK אחד, חבילות APK אחרות שנשלחו באותה גרסה חסומות ביקורות ספציפיות
נתונים סטטיסטיים, מדדים ונתונים סטטיסטיים שילוב: אפשר לסנן נתונים ספציפיים לכלי רכב. כן, אני רוצה להפריד
הוספה לאינדקס ודירוג בחיפוש בנייה מחוץ לעמידה הנוכחית אין העברת נתונים
שילוב עם אפליקציות אחרות סביר להניח שלא יהיה צורך בשינויים, בהנחה שקוד המדיה משותף בין שתי חבילות ה-APK ייתכן שיהיה צורך לעדכן את האפליקציה המתאימה, למשל כדי להפעיל URI באמצעות Google Assistant.

שאלות נפוצות

בקטעים הבאים ריכזנו תשובות לכמה שאלות נפוצות בנושא מערכת ההפעלה Android Automotive.

חומרה

האם לאפליקציה שלי יש גישה למיקרופון

לאפליקציות שמטרגטות ל-Android 10 (רמת API 29) ואילך, אפשר לעיין במאמר בנושא שיתוף תיעוד של קלט אודיו. זו לא שימושי לפני רמת API 29.

לאילו ממשקי API לרכב אפשר לקבל גישה ואיך?

אתם מוגבלים לממשקי ה-API שנחשפים על ידי ה-OEM. אנחנו מפתחים תהליכים כדי לסטנדרט את הגישה לממשקי ה-API האלה.

אפליקציות יכולות לגשת לממשקי ה-API של הרכב באמצעות SetProperty() ו-GetProperty() ב-CarPropertyManager. קוד המקור או במאמרי העזרה כדי לראות רשימה של כל הנכסים הזמינים. אם יש הערה לנכס עם @SystemApi, הוא מוגבל לאפליקציות מערכת שנטענו מראש.

אילו סוגים של קודק אודיו נתמכים?

מידע נוסף על קודק האודיו ב-Android CDD.

האם יש תמיכה ב-Widevine DRM?

כן. Widevine DRM נתמך.

פיתוח ובדיקה

האם יש הגבלות או המלצות לגבי השימוש בספריות ובערכות SDK של צד שלישי?

אין לנו הנחיות ספציפיות לגבי השימוש בספריות ובערכות SDK של צד שלישי. גם אם תבחרו להשתמש בספריות ובערכות SDK של צד שלישי, האחריות לתשלום כדי לעמוד בכל דרישות האיכות של אפליקציות הרכב.

אפשר להשתמש בשירות שפועל בחזית?

התרחיש לדוגמה היחיד המותר לשימוש בשירות שפועל בחזית הוא הורדת תוכן של לשימוש במצב אופליין. אם יש לכם תרחיש לדוגמה נוסף לשירות בחזית שאתם רוצים שנוסיף תמיכה בו, תוכלו ליצור איתנו קשר דרך קבוצת הדיון של Android Automotive OS.

פרסום אפליקציות ל-Android Automotive OS

איך מפרסמים אפליקציה ל-Android Automotive OS באמצעות Google Play Console?

תהליך פרסום האפליקציה דומה לתהליך של פרסום אפליקציה לטלפון, אבל צריך להשתמש גורם צורה אחר. כדי לצרף את האפליקציה לשימוש ב-Android Automotive גורם הצורה של מערכת ההפעלה, מבצעים את השלבים הבאים:

  1. פותחים את Play Console.
  2. בוחרים את האפליקציה הרצויה.
  3. בתפריט הימני, לוחצים על פרסום > הגדרה > הגדרות מתקדמות > גורמי צורה.
  4. לוחצים על הוספת גורם צורה > Android Automotive OS, ואז פועלים לפי ב-Play Console.

מקורות מידע נוספים

כדי לקבל מידע נוסף על Android Automotive OS, אפשר לעיין במקורות המידע הנוספים הבאים במשאבי אנוש.

דוגמיות

מדריכים

בלוגים

סרטונים

דיווח על בעיה ב-Android Automotive OS Media

אם נתקלתם בבעיה במהלך הפיתוח של אפליקציית המדיה ל-Android Automotive OS, אפשר לדווח עליה באמצעות הכלי של Google למעקב אחר בעיות. חשוב להקפיד למלא את כל המידע הנדרש בתבנית הבעיה.

דיווח על בעיה חדשה

לפני שמדווחים על בעיה חדשה, כדאי לבדוק אם היא כבר דווחה ברשימת הבעיות. ניתן להירשם ולהצביע על בעיות על ידי לחיצה על הכוכב של בעיה ב- מכשיר המעקב. מידע נוסף זמין במאמר הבא: הרשמה לבעיה.