הוספת תמיכה ב-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, ולוחצים על הבא.

    כל המכוניות שתומכות ב-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 אפליקציה.

<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 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 guide למידע נוסף.

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

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

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

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

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

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

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

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

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

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

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

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

אם רלוונטי, מטמיעים תמיכה בהפעלה במצב אופליין. מכוניות עם 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 Package Kit (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 למעקב אחר בעיות. חשוב להקפיד למלא את כל המידע הנדרש בתבנית הבעיה.

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

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