מערכת ההפעלה Android Automotive OS מאפשרת למשתמשים להתקין אפליקציות במכונית. כדי להגיע אל משתמשים בפלטפורמה הזו, צריך להפיץ אפליקציה מותאמת לנהגים תואם ל-Android Automotive OS. אפשר להשתמש כמעט בכל הקוד במשאבים באפליקציית Android Auto, אבל צריך ליצור גרסת build נפרדת עומד בדרישות שמפורטות בדף הזה.
סקירה כללית על הפיתוח
כדי להוסיף תמיכה ב-Android Automotive OS, צריך רק כמה שלבים, כפי שמתואר בסעיפים הבאים:
- מפעילים את התכונות לכלי רכב ב-Android Studio.
- יוצרים מודול של כלי רכב.
- לעדכן את יחסי התלות של Gradle.
- לחלופין, אפשר ליישם הגדרות ופעילויות כניסה.
- אפשר גם לקרוא טיפים למארחי מדיה.
שיקולים לגבי התכנון
מערכת Android Automotive OS מטפלת בתוכן המדיה מקבל משירות דפדפן המדיה של האפליקציה. פירוש הדבר הוא שהאפליקציה לא משרטטת את ממשק המשתמש ולא מפעילה אף הפעילויות שלכם כאשר משתמש מפעיל הפעלת מדיה.
אם אתם מטמיעים הגדרות או פעילויות כניסה, הפעילויות האלה חייבות להיות מותאמות לרכב. אפשר לעיין בהנחיות לעיצוב עבור Android Automotive OS במהלך עיצוב האזורים האלה באפליקציה.
הגדרת הפרויקט
עליך להגדיר מספר חלקים בפרויקט של האפליקציה כדי להפעיל תמיכה ב-Android Automotive OS.
הפעלת תכונות לכלי רכב ב-Android Studio
יש להשתמש ב-Android Studio 4.0 ואילך כדי לוודא שכל התכונות של Automotive OS מופעל.
יצירת מודול של כלי רכב
רכיבים מסוימים של Android Automotive OS, כמו המניפסט, כוללים דרישות ספציפיות לפלטפורמה. ליצור מודול שיכול לשמור לרכיבים האלה בנפרד מקוד אחר בפרויקט, כמו את הקוד שמשמש את אפליקציית הטלפון.
כדי להוסיף לפרויקט מודול של כלי רכב:
- ב-Android Studio, לוחצים על קובץ > חדש > מודול חדש.
- בוחרים באפשרות מודול לרכב ולוחצים על הבא.
- מזינים שם אפליקציה/ספרייה. זה השם שהמשתמשים רואים לאפליקציה שלך ב-Android Automotive OS.
- מזינים את שם המודול.
- משנים את שם החבילה בהתאם לאפליקציה.
בוחרים באפשרות API 28: Android 9.0 (Pie) בתור Minimum SDK, ולוחצים על הבא.
כל המכוניות שתומכות ב-Android Automotive OS פועלות ב-Android 9 (רמת API 28) או לכן בחירה בערך הזה תטרגט את רכבים תואמים.
בוחרים באפשרות ללא פעילות ואז לוחצים על סיום.
לאחר יצירת המודול ב-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 repositorygit clone https://github.com/android/uamp.git
# Fetch the appropriate pull request to your local repositorygit fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME
# Switch to the new branchgit checkout NEW_LOCAL_BRANCH_NAME
כדי להטמיע את הפעילות שלכם:
- מעתיקים את התיקייה
automotive/automotive-lib
למודול של כלי הרכב. - הגדרת עץ העדפות כמו
automotive/src/main/res/xml/preferences.xml
הטמעת
PreferenceFragmentCompat
שמוצגת פעילות ההגדרות. אפשר להציג אתSettingsFragment.kt
ואת קובציSettingsActivity.kt
ב-UAMP ובהגדרות Android guide למידע נוסף.
כשמיישמים את פעילות ההגדרות, כדאי ליישם את השיטות המומלצות הבאות חלק מהרכיבים בספריית ההעדפות:
- לכלול שתי רמות עומק לכל היותר מתחת לתצוגה הראשית פעילות ההגדרות שלכם.
- אין להשתמש ב-
DropDownPreference
. במקום זאת, צריך להשתמש ב-ListPreference
. - רכיבים ארגוניים:
PreferenceScreen
- זו חייבת להיות הרמה העליונה של עץ ההעדפות.
PreferenceCategory
- משמש לקיבוץ של
Preference
אובייקטים יחד. - לכלול
title
.
- משמש לקיבוץ של
- צריך לכלול
key
ו-title
בכל הרכיבים הבאים. אפשר גם כולליםsummary
,icon
, או את שניהם:Preference
- להתאים אישית את הלוגיקה בקריאה החוזרת (callback) של
onPreferenceTreeClick()
הטמעתPreferenceFragmentCompat
.
- להתאים אישית את הלוגיקה בקריאה החוזרת (callback) של
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 לא משתמשות בו.
דרישה להיכנס לחשבון בתחילת האפליקציה
כדי לחייב משתמש להיכנס לחשבון כדי להשתמש באפליקציה, צריך להשתמש בדפדפן המדיה השירות חייב לבצע את הפעולות הבאות:
- בשיטה
onLoadChildren()
של השירות, שולחים תוצאה אחת (null
) באמצעותsendResult()
. - מגדירים את
PlaybackStateCompat
של סשן המדיה. אלSTATE_ERROR
באמצעותsetState()
. הפעולה הזו מנחה את Android Automotive OS שלא ניתן לבצע פעולות אחרות עד השגיאה נפתרה. - הגדרת
PlaybackStateCompat
של סשן המדיה קוד שגיאה ל-ERROR_CODE_AUTHENTICATION_EXPIRED
. הפעולה הזו מנחה את Android Automotive OS שהמשתמש צריך לבצע אימות. - הגדרת
PlaybackStateCompat
של סשן המדיה הודעת שגיאה באמצעותsetErrorMessage()
. מאחר שהודעת השגיאה הזו מוצגת למשתמשים, צריך לבצע התאמה לשוק המקומי ללוקאל הנוכחי של המשתמש. הגדרת
PlaybackStateCompat
של סשן המדיה תוספות באמצעותsetExtras()
. כוללים את שני המפתחות הבאים:PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: מחרוזת שמוצגת על הלחצן שמתחילה בתהליך הכניסה לחשבון. מאחר שהמחרוזת הזו גלויה למשתמש, צריך להתאים אותה לשוק המקומי ובלוקאל הנוכחי.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
:PendingIntent
שמפנה את לפעילות הכניסה שלכם כשהמשתמש מקיש על הלחצן שאליו מפנה המודעהPLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
.
קטע הקוד הבא מראה איך האפליקציה יכולה לדרוש מהמשתמש להיכנס לחשבון לפני השימוש באפליקציה:
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
:
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: תווית שעליה צריך ללחוץ כדי לפתור את השגיאה. כי המחרוזת הזו גלוי למשתמש, כדאי להתאים אותו ללוקאל הנוכחי של המשתמש.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
: ה-PendingIntent
שהלחצן מפעיל כדי לפתור את השגיאה, למשל, על ידי הפעלת פעילות הכניסה שלך.
שגיאות שמאפשרות פעולה מופיעות בתור 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 גורם הצורה של מערכת ההפעלה, מבצעים את השלבים הבאים:
- פותחים את Play Console.
- בוחרים את האפליקציה הרצויה.
- בתפריט הימני, לוחצים על פרסום > הגדרה > הגדרות מתקדמות > גורמי צורה.
- לוחצים על הוספת גורם צורה > Android Automotive OS, ואז פועלים לפי ב-Play Console.
מקורות מידע נוספים
כדי לקבל מידע נוסף על Android Automotive OS, אפשר לעיין במקורות המידע הנוספים הבאים המשאבים.
דוגמיות
מדריכים
- עיצוב לנהיגה
- באמצעות אפליקציית הבדיקה של בקר המדיה
- התראות ב-Android Automotive OS
- האיכות של אפליקציות ל-Android למכוניות
בלוגים
סרטונים
- איך יוצרים אפליקציות מדיה לרכבים (כנס מפתחי Android לשנת 2019)
- איך יוצרים אפליקציות ל-Android לרכבים (Google I/O'19)
דיווח על בעיה ב-Android Automotive OS Media
אם נתקלתם בבעיה במהלך הפיתוח של אפליקציית המדיה ל-Android Automotive OS, אפשר לדווח עליה באמצעות הכלי של Google למעקב אחר בעיות. חשוב להקפיד למלא את כל המידע הנדרש בתבנית הבעיה.
לפני ששולחים בעיה חדשה, כדאי לבדוק אם היא כבר דווחה במסגרת הבעיות חדשה. ניתן להירשם ולהצביע על בעיות על ידי לחיצה על הכוכב של בעיה ב- מכשיר המעקב. מידע נוסף זמין במאמר הבא: הרשמה לבעיה.