ככל שהמסכים ברכבים עם Android Auto ו-Android Automotive OS מתרחבים, המפתחים מתמודדים עם אתגר כפול וייחודי: לספק חוויות עשירות ודינמיות בזמן חנייה, וחוויות בטוחות לנהגים שמבוססות על תבניות בזמן נהיגה. בסשן הטכני המקיף הזה, שנמשך 30 דקות, אנחנו בוחנים את הארכיטקטורה מקצה לקצה ואת גישות הפיתוח להתאמת אפליקציות ל-Android למכוניות.
בסשן הזה נדבר על כל מה שצריך לדעת כדי להעלות את האפליקציה שלכם על הכביש – החל מהיסודות של עיצוב אפליקציות לשימוש ברכבים, ועד לגישות החדשות ביותר ליצירת חוויות מדיה שעוברות מאודיו לווידאו כשהרכב עובר ממצב נסיעה למצב חנייה.
תמליל
טוב.
שלום לכולם.
תודה שהצטרפתם אלינו לסשן הזה, "הרכב הוא הקנבס שלכם".
בסשן הזה נדבר על פיתוח ל-Android לרכב.
אני פול למרטסמה.
ואני תומאס וות'רס.
אנחנו מהנדסים לקשרי מפתחים בצוות Android לרכבים.
אני בטוח שהרבה מכם השקיעו הרבה זמן ואנרגיה כדי לוודא שהאפליקציות שלכם נראות נהדר ופועלות בצורה חלקה במגוון רחב של מסכים ומכשירים שונים, טלפונים, מכשירים מתקפלים, טאבלטים ומה לא.
היום נתמקד במסך שאולי לא חשבתם עליו.
הוא גם יכול לעזור לכם להגיע למשתמשים בדרך ייחודית.
זה המסך המובנה ברכב.
אז בואו נתחיל בסקירה קצרה של מה שאני מתכוון כשאנחנו מדברים על Android לרכבים.
"Android לרכבים" הוא לא מוצר אחד.
יש שתי פלטפורמות שאפשר לטרגט.
הראשונה היא Android Auto, מערכת שמופעלת באמצעות הטלפון ומוצגת על מסך הרכב.
ב-Android Auto, האפליקציה פועלת בטלפון ומקרינה את ממשק המשתמש שלה למסך הרכב באמצעות חיבור קווי או אלחוטי.
השנייה היא Android Automotive OS, גרסה של Android שפועלת ישירות ברכב עצמו.
מערכת Android Automotive OS פועלת באופן עצמאי מהטלפון, יש לה גישה ישירה לחומרה של הרכב, כמו בקרת האקלים והרדיו, וחשוב מכך, היא גם מנהלת את חיבור הנתונים שלה.
חלק מהרכבים שמותקנת בהם מערכת ההפעלה Android Automotive OS הם רכבים עם שירותי Google מובנים.
בכלי רכב עם שירותי Google מובנים יש גם אפליקציות ושירותים של Google, כמו חנות Play, Gemini ומפות Google.
למרות שיש שתי פלטפורמות, המטרה שלנו היא לאפשר לכם לפתח אפליקציה פעם אחת ולפרוס אותה כך שתספק חוויית שימוש נהדרת בשתי הפלטפורמות.
עכשיו נראה דוגמה לאפליקציית מדיה שנוצרה פעם אחת באמצעות ספריית האפליקציות לרכב, ואיך היא תיראה גם ב-Android Auto וגם ב-Android Automotive OS, במגוון גדלים וצורות של מסכים.
יש הרבה סוגים שונים של מכשירים ופלטפורמות שאפשר לפתח בשבילם.
אז למה זה לא ככה במכוניות?
קודם כול, קנה המידה כאן עצום.
כיום יש יותר מ-250 מיליון מכוניות שתואמות ל-Android Auto, ויותר מ-100 דגמי מכוניות עם שירותי Google מובנים ב-16 מותגים שונים.
כשהאפליקציות שלכם מותקנות ברכבים, אתם יכולים להגיע למשתמשים בנסיעות היומיות שלהם, בדרך לפעילויות משפחתיות ובחזרה מהן, בסידורים ואפילו בנסיעות ארוכות.
לפי סקר הנהיגה האמריקאי של AAA לשנת 2024, נהגים בארה"ב מבלים בממוצע 60 דקות ביום מאחורי ההגה.
אבל אתם לא מגיעים למשתמשים רק כשהם נוהגים.
אתם גם מגיעים אליהם כשהם חונים.
למשל, אם הם טוענים את הרכב בתחנת טעינה לרכב חשמלי או מחכים בתור לאיסוף הילדים מבית הספר.
עם העלייה בשימוש במסכים ספציפיים לנוסעים, אנחנו מצפים לראות עוד יותר הזדמנויות בעתיד להגביר את המעורבות של המשתמשים.
טוב.
עכשיו נראה את הסוגים השונים של חוויות המשתמש שאפשר ליצור לרכבים.
כדי להבין איך לפתח אפליקציות לרכבים, כדאי להבין את שני המצבים העיקריים שבהם אפליקציות פועלות בתוך רכב.
הסוג הראשון הוא אפליקציות שמשתמשים בהן בזמן הנהיגה.
אלה אפליקציות שעברו אופטימיזציה לנהיגה, ואפשר להשתמש בהן כשהרכב בתנועה.
זה כולל אפליקציות בקטגוריות שמופיעות כאן במסך, כמו אפליקציות אודיו, שבדרך כלל אנחנו מתייחסים אליהן כמדיה, אפליקציות להעברת הודעות ולתקשורת, ניווט וכו'.
חוויות שימוש שמותאמות לנהיגה חייבות לעמוד בקריטריונים מחמירים של אמצעי הגנה מפני הסחות דעת.
יש שיקולים מיוחדים שצריך להביא בחשבון כשבונים ממשק משתמש לאפליקציה, כדי שאפשר יהיה להשתמש בה בבטחה בזמן שהרכב בתנועה.
יש כמה דרכים שונות ליצור אפליקציות שמותאמות לנהיגה.
אבל בהרצאה הזו נתמקד ספציפית בשימוש בספריית האפליקציות לרכב.
זוהי קבוצה של ספריות Jetpack שמספקות מסגרת של תבניות לממשקי משתמש שמותאמים לנהיגה, וגם דואגות להתאמה לתצורות החומרה השונות שקיימות במכוניות.
לכן, כדאי לחשוב על אופני קלט, גודלי מסך ויחסי גובה-רוחב.
זו לא הדרך היחידה ליצור חוויות שעברו אופטימיזציה לנהיגה ברכבים, אבל הגישה שאני רוצה להתמקד בה בשיחה הזו היא פיתוח באמצעות ספריית האפליקציות של Android לרכבים.
אנחנו קוראים לזה בקיצור CAL.
כמו שציינתי קודם, ספריית האפליקציות לרכב היא קבוצה של ספריות שעוזרות לפתח אפליקציות לשימוש בכלי רכב.
זוהי מסגרת מבוססת-תבניות שמספקת ממשקי משתמש שמותאמים לנהיגה, ומטפלת בהתאמה לתצורות שונות של חומרה.
אתם יכולים לפתח את האפליקציה ולהיות בטוחים שהיא תפעל היטב בכל התצורות השונות האלה, בין אם הן פועלות ב-Android Auto או ב-Android Automotive OS.
אפליקציות שנוצרו באמצעות CAL יכולות להסתמך על ארכיטקטורת הלקוח המארח הזו.
האפליקציה המארחת, שהיא Android Auto עצמה או Google Automotive App Host במקרה של רכבים עם שירותי Google מובנים, היא כלי העיבוד של המערכת.
בסופו של דבר, הוא שולט במה שצריך להציג למשתמש במסכים שלו.
לכן, כמפתחי אפליקציות, אתם לא אלה שמציירים את הפיקסלים בסופו של דבר.
במקום זאת, אתם מזינים נתונים מובְנים ואת מצב הנתונים שלכם לתבניות של ספריית האפליקציות לרכב.
המארח הזה מקבל את הנתונים ומציג אותם בצורה בטוחה, בהתאם לתקנות הבטיחות, בפריסה שמותאמת להפחתת הסחות הדעת.
אז בואו נסתכל על המחלקות ב-CAL, מה צריך להרחיב כדי לבנות את האפליקציה, החל מ-CarAppService.
זוהי מחלקת משנה של שירות Android שמשמשת כנקודת כניסה לאפליקציות מארחות כדי לתקשר עם אפליקציות לקוח, והמטרה שלה היא ליצור מופעי סשן שהמארח יוכל לקיים איתם אינטראקציה.
אפשר לחשוב על סשן כעל מופע של אפליקציית לקוח שפועלת במסך ברכב.
כמו רכיבים אחרים של Android, יש לו מחזור חיים משלו שאפשר להשתמש בו כדי לאתחל ולפרק משאבים שמשמשים במהלך קיומו של מופע הסשן.
זהו קשר של אחד לרבים בין CarAppService לבין סשן.
לדוגמה, ל-CarAppService יכולים להיות שני מופעי סשן, אחד למסך הראשי ואחד למסך של לוח המחוונים באפליקציות ניווט שתומכות במסכים של לוח המחוונים.
הנה דוגמה לכך: ברכב יש מסך ראשי ומסך בלוח המחוונים, כל מסך משויך לסשן ייעודי, וכך גם אתם, כמפתחי אפליקציות, יכולים לתמוך ברכבים עם כמה מסכים.
בתוך הסשן, מופעי המסך אחראים ליצירת ממשקי המשתמש שמוצגים על ידי האפליקציות המארחות.
ממשקי המשתמש האלה מיוצגים על ידי מחלקות של תבניות, שכל אחת מהן מייצגת סוג מסוים של פריסה, למשל רשת או רשימה.
לכן, כל סשן מנהל מחסנית של מופעי מסך שמטפלים במסלולי המשתמשים בחלקים שונים של האפליקציה. כמו לסשן, גם למסך יש מחזור חיים משלו שאפשר להתחבר אליו.
אבל רק בגלל שהמארח מעבד את ממשק המשתמש שלכם, ואתם משתמשים בתבניות של ספריית האפליקציות לרכב, זה לא אומר שאתם מוגבלים מאוד או שאתם לא יכולים להתאים אישית את האפליקציה שלכם.
יש מגוון רחב של תבניות ורכיבים שאפשר להשתמש בהם, ואפשר גם לשלב ביניהם כדי לקבל את החוויה הרצויה.
יש תבניות למטרות כלליות, שמתאימות לכל סוגי האפליקציות בספריית האפליקציות לרכב, ויש תבניות למטרות מיוחדות, שמיועדות לחוויית השימוש באפליקציה ספציפית, כמו ניווט או נקודת עניין.
אבל לפני שנפרט על פיתוח חוויות שמותאמות לנהיגה, אני רוצה להתייחס למצב השני שבו אפשר להפעיל אפליקציות ברכבים: כשהרכב חונה.
יש קטגוריות מסוימות של אפליקציות שאפשר להשתמש בהן רק כשהרכב חונה, וזה כולל דברים כמו אפליקציות וידאו, כמובן, משחקים ודפדפנים.
אבל כשהרכב לא בתנועה, ההנחיות בנושא הסחת דעת הנהג לא חלות, ואתם יכולים לספק חוויות שמתאימות יותר לממשק המשתמש הדינמי הקיים שלכם.
אפליקציות במצב חנייה מבוססות על פעילות, והן דומות או אפילו זהות לפעילויות שמשתמשים בהן במכשירים אחרים, כמו טלפונים או טאבלטים. נדבר על אפליקציות במצב חנייה בפירוט בקטע הבא.
למרות שחוויות השימוש באפליקציות במצב חנייה עושות שימוש חוזר בפעילויות קיימות שמותאמות למסך, עדיין יש הנחיות איכות ספציפיות לרכב שצריך לעמוד בהן, החל מהצהרות מניפסט ומגרעות במסך ועד להשהיית ההפעלה כשהרכב מתחיל לנסוע.
כדי לעזור לכם להפוך את העבודה הזו לאוטומטית, השקנו מיומנות חדשה ב-Android לאפליקציות בזמן חניה.
לכן, לפני שמתחילים, צריך לוודא שהתקנתם את Android CLI. אפשר למצוא אותו בקישור הקצר הזה.
ואז יש לנו – אחרי שמגדירים את זה, מריצים את android skills list כדי לבדוק את המיומנויות הזמינות.
android skills list
android skills add android-for-cars-parked-appsיש הרבה מיומנויות שונות שיכולות לעזור לכם לשדרג את פיתוח האפליקציות ל-Android.
ובאופן ספציפי ל-Android לרכבים, אתם יכולים להשתמש ב-android skills add android-for-cars-parked-apps כדי להוסיף את המיומנות להקשר של הנציג.
עכשיו, לא משנה באיזה סוכן AI אתם משתמשים, הוא נותן לכם הנחיות מפורטות להגדרת המניפסט ל-Android Auto או ל-Android Automotive OS, לטיפול בתוספות לחלונות הרכב ובדברים כמו ניווט לאחור, לאכיפת הגבלות על הפעלה כדי למנוע הסחת דעת של הנהג, והוא יכול אפילו לבדוק את אפליקציית הווידאו, המשחק או הדפדפן שלכם לפני שאתם שולחים אותן ל-Google Play.
לכן, פיתוח אפליקציות לרכבים הוא גם קצת ייחודי בגלל הרעיון של קטגוריות האפליקציות האלה.
כמו שציינתי קודם, יש קטגוריות מסוימות של אפליקציות שאפשר להשתמש בהן בזמן נהיגה, ויש קטגוריות אחרות של אפליקציות שאפשר להשתמש בהן בזמן חנייה.
הקטגוריות המודגשות הן אלה שאפשר להשתמש בהן בזמן הנהיגה.
חלק מהן מסומנות ב-CAL, כמו שציינתי, זו ספריית האפליקציות לרכב, ואפליקציות בקטגוריה הזו משתמשות בתבניות כמו אלה שראינו לפני רגע.
עכשיו אעבור עליהם במהירות, בלי להיכנס ליותר מדי פרטים.
נתחיל עם אפליקציות מדיה. אלה אפליקציות שמפעילות אודיו, לא וידאו.
יש שתי דרכים ליצור אותם.
האפשרות הראשונה, שמסומנת ב-MediaBrowserService, היא האפשרות הפשוטה ביותר.
אתם מספקים מטא-נתונים, וממשק המסך של מערכת המידע והבידור דואג לעיבוד של ממשק המשתמש של ההפעלה ושל דפדפן המדיה באופן שמותאם לרכב.
האפשרות השנייה היא לפתח אפליקציות מדיה באמצעות ספריית האפליקציות לרכב. האפשרות הזו נותנת לכם יותר שליטה ואפשרויות להתאים אישית את הסגנון והתצוגה של אפליקציות המדיה שלכם, ותומאס יראה לנו עוד על כך בעוד רגע.
אפליקציות ניווט הן כמובן תרחיש שימוש מרכזי, והן מספקות מסלולים והנחיות מפורטות.
גם אפליקציות לנהגים בנסיעות שיתופיות נכללות בקטגוריה הזו.
אפליקציות של נקודות עניין עוזרות לכם למצוא מיקומים שימושיים בקרבת מקום, כמו מטענים לרכב חשמלי או מקומות חנייה.
אפליקציות של האינטרנט של הדברים (IoT) מאפשרות לכם לגשת למכשירים חכמים כשאתם בדרכים, למשל לניהול הבית.
יש גם אפליקציות של מזג אוויר, שיכולות לספק מכ"ם בזמן אמת, התראות על סופות ותחזיות ספציפיות למיקום.
ולבסוף, תקשורת מתחלקת לשלוש קטגוריות משנה: הרחבת ההתראות הבסיסיות לרכב, או אפליקציות להעברת הודעות ולשיחות וידאו.
ויש גם את הקטגוריות בהמתנה: אפליקציות סטרימינג של וידאו, משחקים ודפדפני אינטרנט.
אני שמח להודיע שלפני כמה שבועות פתחנו לכל המפתחים את האפשרות לפרסם משחקים ב-Android Auto וב-Android Automotive OS.
חלק מהקטגוריות האלה פתוחות, חלק בגרסת בטא וחלק יושקו בקרוב.
"פתוחה" פירושה שכל מפתח יכול לשלוח אפליקציה בקטגוריה הזו ישירות לייצור.
גרסת בטא פירושה שאפשר לפרסם במסלולים פנימיים או במסלולים בקבוצה מוגדרת, אבל אי אפשר לפרסם את האפליקציה בסביבת הייצור, אלא אם התקבלתם לתוכנית גישה מוקדמת (EAP).
המסמכים של כל אחת מהקטגוריות האלה כוללים מידע נוסף וקישור לטופס ההתעניינות שלנו.
הקטגוריה "בקרוב" מיועדת לקטגוריות שכרגע לא נתמכות, אבל אנחנו מתכננים לתמוך בהן בעתיד.
המטרה הסופית שלנו היא לאחד את הפלטפורמה.
אנחנו רוצים שתהיה לכם אפשרות לפתח אפליקציה פעם אחת ולהפיץ אותה גם ל-Android Auto וגם ל-Android Automotive OS, בלי קשר לקטגוריה, כדי להגיע לכמה שיותר משתמשים.
עכשיו נעבור לתומאס שידבר על מדיה.
תודה.
מצוין.
לכן, בשנה שעברה השקנו את ספריית האפליקציות לרכב לאפליקציות מדיה בגרסה 1.8, והוספנו ממשקי משתמש של תבניות גלישה ופעולות בהתאמה אישית ל-Android Auto.
זה כלל את התבנית להפעלת מדיה שמוצגת כאן בצד ימין.
השנה בכנס I/O, הצגנו ממשקי משתמש נוספים שניתן לעיין בהם דרך ספריית האפליקציות לרכב בגרסה 1.9.
עכשיו, כשגרסת CAL 1.9 הגיעה לשלב הבטא, אתם יכולים להשתמש בעדכונים של תכונות מרכזיות ב-Auto וב-Automotive OS.
התכונות הבולטות כוללות התאמה אישית של המותג באמצעות ביטוי האפליקציה, שמאפשרת להתאים אישית אסימוני צבע וצורה עם פריסות שמוצגות במארח תוך שמירה על כללי הבטיחות, לצד רכיבי ממשק משתמש חדשים כמו קטעי זרקור, פריטים ברשימה דחוסה, צ'יפים שניתן לגלול בהם ומיני-נגן קבוע.
בנוסף, גרסה 1.9 של CAL מרחיבה את התמיכה בתבניות מדיה ל-AAOS, וכך מאחדת את הפלטפורמות בשתי הסביבות.
בקרוב נשיק את הגרסה הבאה של ספריית האפליקציות לרכב: CAL גרסה 10.
גרסה 10 של CAL תכלול תבניות מותאמות אישית נוספות לאפליקציות תקשורת, שיספקו חוויות שיחה חזקות ומותאמות אישית יותר בזמן הנהיגה.
אנחנו כוללים גם קטגוריה חדשה של אפליקציות ותבניות לאפליקציות, שכוללות ממשקי צ'אט עם AI בזמן הנהיגה.
בנוסף, אנחנו עובדים על עוד פונקציות שיאפשרו מעבר חלק יותר בין מצב חנייה למצב נהיגה באמצעות התבניות של ספריית האפליקציות לרכב.
בקרוב נוסיף עוד אפשרויות.
יכולות Park-to-drive באמצעות ספריית האפליקציות לרכב מאפשרות לאפליקציה לעבור באופן דינמי בין מצבים ולהציג תוכן מותאם כשהרכב נייח, ולחזור בצורה חלקה לתבניות של ספריית האפליקציות לרכב בזמן הנהיגה.
האפליקציות העיקריות כוללות תהליכי אימות מותאמים אישית כשאתם לא בתנועה, או הפעלת חוויה ייעודית בזמן חנייה, כמו סטרימינג של פודקאסטים בווידאו או קליפים של מוזיקה.
התכונה הזו משתלבת ישירות בתבנית של הפעלת המדיה.
לכן, כשהרכב לא בתנועה, הנהגים יכולים לגשת באופן מלא לפעילות המקורית של האפליקציה ב-Android, כולל מדיה עשירה כמו סטרימינג של וידאו.
ברגע שמתחילים לנסוע ברכב, מופעלים אמצעי הגנה מפני הסחות דעת, והאפליקציה עוברת חזרה לתבנית המדיה של ספריית האפליקציות לרכב כדי לאפשר האזנה לאודיו ללא הפרעות ובהתאם לדרישות.
אנחנו נמצאים ברגע של שינוי בחוויית השימוש ברכב.
אפליקציות מדיה רוצות להתפתח מעבר לממשקי הגלישה וההפעלה המסורתיים כדי לספק רגעים עשירים, סוחפים ואינטראקטיביים יותר לנהגים ולנוסעים כאחד.
עכשיו נראה דוגמה לאופן שבו אפשר להוסיף פעילות וידאו מקורית באמצעות ספריית Media3, כך שהסרטון יתחיל לפעול כשהרכב עובר למצב חנייה.
כדי להתחיל, צריך לחבר משטח עיבוד וידאו ישירות למופע ההפעלה ברקע.
override fun onStart() {
super.onStart()
...
controllerFuture = MediaController.Builder(
this,
sessionToken
).buildAsync()
controllerFuture?.addListener({
mediaController = controllerFuture?.get()
playerView.player = mediaController
}, ContextCompat.getMainExecutor(this))
}כדאי להימנע מיצירת מופע של נגן מדיה נפרד בפעילות הזו, ובמקום זאת, לשמור על ExoPlayer או נגן מדיה מרכזי בשירות הראשי, כמו שירות ספריית מדיה Media3, שמטפל בשילוב של שידורי אודיו ווידאו.
לכן, בזמן נסיעה, כשאין שירות פעיל שמקושר, הנגן מפענח רק אודיו. אבל כשהנהגים פותחים את פעילות הווידאו בזמן חנייה, צריך לצרף את משטח הרינדור שלו ישירות לנגן השירות הבסיסי.
לכן, כשמשתמשים ב-Media3, mediaController מטמיע את הנגן באופן מקורי, וכך מאפשר הקצאה ישירה, כמו שרואים כאן, playerView set-- playerView.player מוגדר ישירות ל-mediaController.
בשלב הבא, צריך לרשום את נקודת הכניסה המקורית באמצעות ParkedOnlyOnClickListener.
val watchVideoAction = Action.Builder()
.setTitle("Watch Video")
.setIcon(videoCarIcon)
.setOnClickListener(
ParkedOnlyOnClickListener.create {
val intent = Intent(
carContext,
VideoPlayerActivity::class.java
)
.apply {
addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
)
}
carContext.startActivity(intent)
})
.build()ה-wrapper הזה מספק טריגר של Intent בסרגל הכותרת של ממשק הפעלת המדיה.
לכן, צריך לכלול פעולה להפעלת הסרטון, ולעטוף את ה-selection listener שלו ב-ParkedOnlyOnClickListener.
לכן, במצב נהיגה, האפליקציה המארחת מיירטת את הלחיצות האלה ומציגה הודעת בטיחות של המערכת, כך שלא תוכלו להיכנס למסך הזה בזמן הנהיגה. עם זאת, כשהרכב חונה, פונקציית ה-callback מפעילה את startActivity בתוך carContext כדי להפעיל את הפעילות הייעודית במסך מלא.
חשוב לזכור: באפליקציות האלה של ספריית האפליקציות לרכב, צריך לתייג את יעד הסרטון בתור distractionOptimized=false בתוך המניפסט כדי שמערכת ההפעלה תזהה שזה תהליך עבודה שמתבצע רק בזמן חנייה.
<activity
android:name=".VideoPlayerActivity"
android:exported="false"
android:launchMode="singleTop">
<meta-data
android:name="distractionOptimized"
android:value="false" />
</activity>ולבסוף, בואו נראה מה קורה כשהנהג מעביר את ההילוך מחנייה לנסיעה.
אם הפעילות לא מותאמת להסחות דעת, והיא נשארת פעילה כשהרכב בתנועה, מערכת AAOS מציגה שכבת-על לחסימת המערכת, שבעצם אומרת לכם לחנות כדי להמשיך להשתמש באפליקציה.
כדי למנוע את חסימת המסך, המטרה שלנו היא לחזור בצורה חלקה לתבנית של הפעלת המדיה בלי להפריע לאודיו.
אז כשהערך של isRequiresDistractionOptimization הוא true, אנחנו בעצם מנקים את משטח העיבוד של הסרטון מסשן המדיה הבסיסי, ומפעילים את הפעולה finish בפעילות של הנגן. מכיוון שהפעילות הופעלה מעל חוויית ה-CAL, הפעולה finish מחזירה ישירות לתבנית של הפעלת המדיה וממשיכה את הפעלת האודיו.
class VideoPlayerActivity : ComponentActivity(){
override fun onStart() {
…
if (uxRestrictionsManager?
.currentCarUxRestrictions?
.isRequiresDistractionOptimization
== true) {
revertToCarAppTemplate()
}
}
private fun revertToCarAppTemplate() {
mediaControllerCompat
.sendCommand("CMD_CLEAR_VIDEO_SURFACE",
null, null)
finish()
}
}כדי לספק חוויית משתמש מעולה, חשוב לשמור על הפעלה רציפה של האודיו. לכן, אם סשן המדיה נשאר פעיל כשירות שפועל בחזית, הסאונד ממשיך לפעול בצורה חלקה גם כשהמצבים האלה משתנים.
<activity
android:name="androidx.car.app.activity.CarAppActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK" />
</intent-filter>
<meta-data
android:name="distractionOptimized"
android:value="true" />
</activity>כדאי גם לשנות את onNewIntent במסך CAL כדי לתעד את כוונות SHOW_MEDIA_PLAYBACK.
class MyCarAppSession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
// 1. Link your active MediaSession token with Car App Library's MediaPlaybackManager
val mediaPlaybackManager = carContext.getCarService(MediaPlaybackManager::class.java)
mediaPlaybackManager.registerMediaPlaybackToken(mediaSessionToken)
// 2. Handle deep link if cold-started from the vehicle's media widget
handlePlaybackIntent(intent)
return HomeScreen(carContext)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// 3. Handle deep link when the session is already running
handlePlaybackIntent(intent)
}
}כך, בכל פעם שמשתמשים יבצעו פעולה בווידג'ט המדיה של מערכת הרכב שנמצא במסך הבית של המכונית, קישור העומק ינתב אותם ישירות לתצוגת "מה שומעים עכשיו" בספריית האפליקציות לרכב.
לכן, קל מאוד לאמת את המעברים האלה לאורך תהליך הפיתוח.
אתם יכולים להריץ פקודות adb ב-AAOS.
במקרה הזה, צריך להגיד emulate-driving-state drive או emulate-driving-state park כשרוצים לחזור לפעילות הקודמת.
הנה דוגמה לשימוש באפליקציית המדיה החדשה לדוגמה Media3, שמשתמשת בספריית האפליקציות לרכב עם הפעלת סרטונים במצב חנייה ובמצב נסיעה.
אז כדאי לבדוק את זה בדוכן של Android Adaptive בקומה התחתונה וב-GitHub של car-samples בקרוב מאוד.
היכולות של Park-to-drive זמינות כרגע ב-Android Automotive OS לאפליקציות מדיה שכבר שולבו עם CAL לרכב לחוויית נהיגה, שבה הן יכולות להציע עכשיו חוויות חזקות יותר בזמן חנייה.
בקרוב מאוד נפרסם מידע נוסף על כך במסמכי התיעוד שלנו בכתובת developer.android.com. שם גם תוכלו להביע עניין בהצגת התכונה הזו באפליקציה שלכם.
פול.
מצוין.
תודה, תומאס.
לפני שנסיים, יש לי כמה דרכים לשתף איתכם מידע נוסף על מה שצפוי בהמשך השנה.
כמו שתומאס ציין, CAL 1.9 נמצא כרגע בגרסת אלפא.
בקרוב מאוד היא תהפוך לגרסת בטא.
גרסת אלפא של CAL 1.10 תושק לפני סוף השנה, כדי שתוכלו להתחיל להעריך ממשקי משתמש של שיחות ואת יכולות התקשורת והמעבר ממצב חנייה למצב נסיעה העדכניות ביותר.
ולסיום, כמו שציינתי, אנחנו שמחים לשתף שמשחקים זמינים ב-Android Auto וב-Android Automotive OS, אז זה באמת הזמן המושלם לבצע אופטימיזציה של כותרי המשחקים שלכם לרכבים.
כדי לקבל מידע נוסף על פרטי ההטמעה, חשוב לעיין במסמכים שבמדריך "פיתוח משחקים לרכבים".
בדף "מה חדש" אפשר לקרוא מידע נוסף על התאמת משחקים לרכבים, וגם להתעדכן בשינויים ובחידושים אחרים ב-Android לרכבים.
אנחנו מקווים שהבנתם איך מכוניות והמשתמשים שלהן מוכנים לאפליקציות שלכם.
אתם יכולים להשתמש באפליקציות הרספונסיביות הקיימות שלכם כדי ליצור חוויות עשירות במצב חנייה, ולהשתמש במגוון תבניות של ספריית האפליקציות לרכב כדי ליצור את החוויות האלה שמותאמות לנהיגה בטוחה.
לפני הפרסום, אתם יכולים לבצע בדיקה יסודית באמצעות מערכת מולטימדיה שולחנית, האמולטורים, AAOS שפועל ב-Pixel Tablet או Firebase Test Lab.
כבר יש לכם את הכישורים לפתח לסביבה העסקית הזו, ומיליוני מכוניות מחכות לאפליקציות שלכם. אז בואו נצא לדרך.
android skills list
android skills add android-for-cars-parked-appsoverride fun onStart() {
super.onStart()
...
controllerFuture = MediaController.Builder(
this,
sessionToken
).buildAsync()
controllerFuture?.addListener({
mediaController = controllerFuture?.get()
playerView.player = mediaController
}, ContextCompat.getMainExecutor(this))
}val watchVideoAction = Action.Builder()
.setTitle("Watch Video")
.setIcon(videoCarIcon)
.setOnClickListener(
ParkedOnlyOnClickListener.create {
val intent = Intent(
carContext,
VideoPlayerActivity::class.java
)
.apply {
addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
)
}
carContext.startActivity(intent)
})
.build()<activity
android:name=".VideoPlayerActivity"
android:exported="false"
android:launchMode="singleTop">
<meta-data
android:name="distractionOptimized"
android:value="false" />
</activity>class VideoPlayerActivity : ComponentActivity(){
override fun onStart() {
…
if (uxRestrictionsManager?
.currentCarUxRestrictions?
.isRequiresDistractionOptimization
== true) {
revertToCarAppTemplate()
}
}
private fun revertToCarAppTemplate() {
mediaControllerCompat
.sendCommand("CMD_CLEAR_VIDEO_SURFACE",
null, null)
finish()
}
}<activity
android:name="androidx.car.app.activity.CarAppActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK" />
</intent-filter>
<meta-data
android:name="distractionOptimized"
android:value="true" />
</activity>class MyCarAppSession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
// 1. Link your active MediaSession token with Car App Library's MediaPlaybackManager
val mediaPlaybackManager = carContext.getCarService(MediaPlaybackManager::class.java)
mediaPlaybackManager.registerMediaPlaybackToken(mediaSessionToken)
// 2. Handle deep link if cold-started from the vehicle's media widget
handlePlaybackIntent(intent)
return HomeScreen(carContext)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// 3. Handle deep link when the session is already running
handlePlaybackIntent(intent)
}
}