ב-Android 10, car_audio_configuration.xml
מחליף את
car_volumes_groups.xml
וגם IAudioControl.getBusForContext
בקובץ התצורה החדש מוגדרת רשימת אזורים. בכל תחום יש אזור אחד לפחות
קבוצות עוצמת קול למכשירים הקשורים אליהם, ולכל מכשיר יש הקשרים
צריך לנתב בתוך התחום הזה. אנחנו צריכים שכל ההקשרים יהיו מיוצגים
בכל תחום.
הגדרת ניתוב אודיו
קובצי מדיניות האודיו, שבדרך כלל נמצאים במחיצת הספק, מייצגים
התצורה של חומרת האודיו של הלוח. כל המכשירים שיש אליהם הפניה ב-
חובה להגדיר את car_audio_configuration.xml
במסגרת
audio_policy_configuration.xml
.
הפעלה של ניתוב AAOS
כדי להשתמש בניתוב מבוסס AAOS, צריך להגדיר את
סימון audioUseDynamicRouting
ל-true
:
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
כאשר false
, ניתוב וחלק גדול של CarAudioService
יושבתו
מערכת ההפעלה תחזור להתנהגות ברירת המחדל של AudioService
.
אזור ראשי
כברירת מחדל, כל קטעי האודיו ינותבו לאזור הראשי. אפשר רק
להיות תחום ראשי אחד, שמצוין בתצורה על ידי המאפיין
isPrimary="true"
הגדרה לדוגמה
לדוגמה, לרכב יכולים להיות שני אזורים – אזור ראשי ומושב אחורי
במערכת בידורית. כך אפשר להגדיר car_audio_configuration.xml
היא:
<audioZoneConfiguration version="2.0"> <zone name="primary zone" isPrimary="true"> <volumeGroups> <group> <device address="bus0_media_out"> <context context="music"/> <context context="announcement"/> </device> <device address="bus3_call_ring_out"> <context context="call_ring"/> </device> <device address="bus6_notification_out"> <context context="notification"/> </device> <device address="bus7_system_sound_out"> <context context="system_sound"/> <context context="emergency"/> <context context="safety"/> <context context="vehicle_status"/> </device> </group> <group> <device address="bus1_navigation_out"> <context context="navigation"/> </device> <device address="bus2_voice_command_out"> <context context="voice_command"/> </device> </group> <group> <device address="bus4_call_out"> <context context="call"/> </device> </group> <group> <device address="bus5_alarm_out"> <context context="alarm"/> </device> </group> </volumeGroups> </zone> <zone name="rear seat zone" audioZoneId="1"> <volumeGroups> <group> <device address="bus100_rear_seat"> <context context="music"/> <context context="navigation"/> <context context="voice_command"/> <context context="call_ring"/> <context context="call"/> <context context="alarm"/> <context context="notification"/> <context context="system_sound"/> <context context="emergency"/> <context context="safety"/> <context context="vehicle_status"/> <context context="announcement"/> </device> </group> </volumeGroups> </zones> </audioZoneConfiguration>
באזור הזה יש הפרדה בין הקשרים למכשירים שונים. הפעולה הזאת מאפשרת
טכנולוגיית HAL כדי להחיל אפקטים שונים של עיבוד ומיקס על כל פלט של מכשיר
באמצעות החומרה של הרכב. המכשירים אורגנו לארבע קבוצות של עוצמת קול:
מדיה, ניווט, שיחות והתראות. אם המערכת מוגדרת
useFixedVolume
, ואז רמות עוצמת הקול של כל קבוצה יועברו
ל-HAL כדי להחיל את הפלט על המכשירים האלה.
בתחום המשני, הפלט הצפוי מגיע ממכשיר פלט אחד. בדוגמה הזו, כל השימושים מנותבים למכשיר אחד ולקבוצת נפח אחסון אחת אל לפשט את הדברים.
הגדרת אודיו של אזור התפוסה
ב-Android 11, הממשק car_audio_configuration.xml
הורחב עוד יותר ל-
מוסיפים שני שדות חדשים, audioZoneId
ו-occupantZoneId
.
הראשון, audioZoneId
, יכול לשמש לניהול טוב יותר של התחומים.
לעומת זאת, אפשר להשתמש ב-occupantZoneId
כדי להגדיר על סמך מזהי משתמשים
מסלול.
כדי להשתמש בשדות החדשים האלה, גרסה 2 של car_audio_configuration.xml
היא
נדרש. ביקור חוזר בתצורת האודיו שלמעלה אבל שימוש בשדה החדש עבור
מזהה אזור התפוסה ומזהה אזור האודיו, ההגדרה החדשה ללא עוצמת הקול
ניתן להגדיר את הגדרות הקבוצה באופן הבא:
<audioZoneConfiguration version="2.0"> <zone name="primary zone" isPrimary="true" occupantZoneId="0"> ... </zone> <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1"> ... </zone> </zones> </audioZoneConfiguration>
ההגדרות שלמעלה מגדירות מיפוי של האזור הראשי לאזור התושב 0, וגם
audioZoneId
1 עד occupantZoneId
1. באופן כללי, כל מיפוי
אפשר להגדיר בין אזור הנוסעים לבין אזור האודיו, אבל המיפוי צריך להיות אחד לאחד.
אלה הכללים שהגדירו את שני השדות החדשים:
- הערך
audioZoneId
של האזור הראשי הוא תמיד אפס - המספרים של
audioZoneId
ו-occupantZoneId
לא יכולים לחזור על עצמם - אפשר להגדיר מיפוי של
audioZoneId
ו-occupantZoneId
רק באמצעות מיפוי אחד
ניתוב דרך UID של אפליקציה
ב-CarAudioManager
נוספו סדרה של ממשקי API מוסתרים כדי לאפשר שימוש באפליקציות
כדי להריץ שאילתות ולהגדיר אזורי אודיו ולהתמקד.
int[] getAudioZoneIds(); int getZoneIdForUid(int uid); boolean setZoneIdForUid(int zoneId, int uid); boolean clearZoneIdForUid(int uid);
ממשקי ה-API שצוינו למעלה מאפשרים לאפליקציה של צד ראשון לנהל ניתוב אודיו שמבוסס על
ב-UID של אפליקציה. לכן, מזהה אזור האודיו וה-UID של האפליקציה הם
מה נדרש. כשהמידע הזה ברשותכם, ניתן להגדיר ניתוב אודיו באמצעות
API של CarAudioManager#setZoneIdForUid
.
שינוי אזורים באפליקציה
כברירת מחדל, כל ניתוב האודיו לאזור הראשי. כדי לעדכן אפליקציה כך
מנותב לאזור אחר, יש להשתמש ב-CarAudioManager#setZoneIdForUid
:
// Find zone to play int zoneId = ... // Find application's uid Int uid = mContext.getPackageManager() .getApplicationInfo(mContext.getPackageName(), 0) .uid; if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) { Log.d(TAG, "Zone successfully updated"); } else { Log.d(TAG, "Failed to change zone"); }
צ הערה: אי אפשר להחליף אזורים באופן דינמי בעדכוני התוכן ובמיקוד. לכן, צריך להפסיק את ההפעלה ולשלוח בקשה חדשה למיקוד כדי לשנות אזורים.
ניתוב לפי User ID
למרות שניתוב מבוסס UID של אפליקציה מאפשר לשלוט בפירוט של כל אפליקציה
ניתוב אודיו, הוא גם דורש שניתוב האודיו בכל אפליקציה יוגדר מראש
אל האפליקציה מבקשת מיקוד אודיו והפעלה של אודיו. כדי לצמצם את הסיכון
ולאפשר לאפליקציות צד שלישי להפעיל אודיו ללא שינוי,
התכונה CarAudioService
משתמשת במיפוי של אזור הנוסעים ברכב ובמיפוי אזורי האודיו כדי להגדיר
הניתוב שמבוסס על מזהה המשתמש. כך, כשמשתמש מתחבר לאזור הנוסעים, האודיו ברכב
נשלחת התראה לשירות. בעזרת האות הזה, הניתוב והניהול של מיקוד האודיו מתבצעים באופן אוטומטי
מוגדר לכל אזורי האודיו.
עדיין ניתן להשתמש בניתוב מבוסס UID באפליקציות, אבל יש לבצע אותו בנפרד
ניתוב מזהה משתמש. המשמעות היא שאם מיפוי האזור שבו נוסעים משתמשים למיפוי אזורי האודיו במכונית הוא
אז ניתוב מבוסס UID מושבת ומנסה להתקשר
CarAudioManager#setZoneidForUid
יקפיץ הודעת שגיאה.
אומנם ניתוב האודיו וניהול ההתמקדות היו פשוטים יותר עם אזור התפוסה
ניהול, המשתמש עדיין צריך להיות מוקצה לאזור תושב. כדי לעשות זאת, אפשר
באמצעות CarOccupantZoneManager#assignProfileUserToOccupantZone
. הזה
ל-API נדרשת הרשאה לניהול משתמשים. הציפייה הנוכחית היא שיצרני ציוד מקורי (OEM) יכולים גם לנהל
הקצאת אזורי תפוסה דרך ממשק משתמש כלשהו של המערכת. בסיום התהליך,
הפעלה, ניתוב אודיו וניהול המוקדים יוגדרו באופן אוטומטי עבור המשתמש.
ניתוב עם setPreferredDevice
בנוסף לשינויים שלמעלה, ב-Android 11 יש גם ממשק API חדש לשליחת שאילתות לגבי מכשירי פלט שמשויך לכל תחום, CarAudioManager#getOutputDeviceForUsage(int zoneId, שימוש פנימי).
אפשר להשתמש ב-API כדי לשלוח שאילתות לגבי מכשיר פלט לאזור מסוים ולמאפיין אודיו.
בשימוש. כך אפליקציות צד ראשון יכולות לנתב אודיו לאזורים שונים על ידי
שימוש ב-API setPreferredDevice
של הנגן.
נדרש API של getOutputDeviceForUsage
PERMISSION_CAR_CONTROL_AUDIO_SETTINGS
ו-API של מערכת. בהמשך מופיע
דוגמה לאיתור מכשיר המדיה עבור אזור מסוים וניתוב אל המכשיר הזה
באמצעות API של setPreferredDevice
.
audioZoneId = ... ; mediaDeviceInfo = mCarAudioManager .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA); … mPlayer.setPreferredDevice(mediaDeviceInfo);