אשכול כלים

השתמש ב- API Cluster Instrument (ממשק API של Android) להצגת אפליקציות ניווט, כולל מפות Google, בתצוגה משנית במכונית, כמו מאחורי ההגה בלוח המכשירים. דף זה מתאר כיצד ליצור שירות לשלוט כי תצוגה משנית וכדי ואז לשלב את השירות עם CarService כדי שאפליקציות הניווט יכולות להציג ממשק משתמש.

טרמינולוגיה

המונחים הבאים משמשים בדף זה:

טווח תיאור
CarInstrumentClusterManager CarManager המאפשרת יישומים חיצוניים להפעיל פעילות על אשכול המכשיר ולקבל הגיע ליעדן כאשר אשכול המכשיר מוכן להציג פעילויות.
CarManager מחלקת הבסיס של כל מנהלי בשימוש על ידי אפליקציות חיצוניות ליצור אינטראקציה עם שירותי רכב ספציפי מיושם על ידי CarService .
CarService שירות Android Platform המספק תקשורת בין אפליקציות חיצוניות (כולל מפות Google) ותכונות ספציפיות לרכב, כגון גישה לאשכול מכשירים.
יַעַד היעד הסופי שאליו ינווט הרכב.
ETA זמן הגעה משוער ליעד.
יחידת ראש (HU) יחידת חישוב ראשונית המוטמעת במכונית. ה- HU מריץ את כל קוד האנדרואיד ומחובר לתצוגה המרכזית במכונית.
אשכול מכשירים תצוגה משנית הממוקמת מאחורי ההגה ובין מכשירי הרכב. זו יכולה להיות יחידת חישוב עצמאית המחוברת ל- HU דרך הרשת הפנימית של המכונית (אוטובוס CAN) או תצוגה משנית המחוברת ל- HU.
InstrumentClusterRenderingService מחלקת בסיס לשירות המשמש לממשק עם תצוגת אשכול המכשירים. יצרני OEM חייבים לספק הרחבה של מחלקה זו המתקיימת אינטראקציה עם החומרה הספציפית ל- OEM.
אפליקציית KitchenSink יישום בדיקה כלול ב- Android Automotive.
מַסלוּל שביל ספציפי שלאורכו מנווט רכב להגיע ליעד.
שירות סינגלטון שירות אנדרואיד עם android:singleUser תכונה. בכל זמן נתון, לכל היותר מופע אחד של השירות פועל במערכת האנדרואיד.

תנאים מוקדמים

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

  • סביבת פיתוח אנדרואיד. כדי להגדיר את סביבת הפיתוח של Android, לראות דרישות בנה .
  • הורד את קוד המקור של אנדרואיד. קבלו את הגרסה האחרונה של קוד המקור אנדרואיד מענף pi-רכב-שחרור (או מאוחר יותר) ב https://android.googlesource.com .
  • יחידת ראש (HU). מכשיר אנדרואיד המסוגל להריץ אנדרואיד 9 (ואילך). מכשיר זה חייב להיות בעל תצוגה משלו ולהיות מסוגל להבהב את המסך עם מבנים חדשים של אנדרואיד.
  • Instrument Cluster הוא אחד מאלה:
    • תצוגה משנית פיזית מחוברת ל- HU. אם חומרת המכשיר והגרעין תומכים בניהול של מספר תצוגות.
    • יחידה עצמאית. כל יחידת חישוב המחוברת ל- HU באמצעות חיבור רשת, המסוגלת לקבל ולהציג זרם וידיאו בתצוגה משלו.
    • תצוגת חיקוי. במהלך הפיתוח, אתה יכול להשתמש באחת הסביבות החקות האלה:
      • תצוגות משניות מדומות. כדי לאפשר תצוגה משנית מדומה בכל הפצה של AOSP Android, עבור אל הגדרות אפשרויות המפתחים ביישום מערכת ההגדרות ולאחר מכן בחר סימול תצוגות משניות. תצורה זו שוות ערך לצירוף תצוגה משנית פיזית, עם המגבלה שתצוגה זו מונחת על גבי הצג הראשי.
      • אשכול מכשירים חיקוי. אמולטור אנדרואיד המצורף רכב אנדרואיד מספק אופציה להצגת אשכול מכשיר עם אנדרואיד אמולטור _qemu-צינורות . השתמש DirectRenderingCluster יישום אשכול מכשיר ההפניה להתחבר הצג החיצוני לחיקוי הזה.

אדריכלות אינטגרציה

רכיבי אינטגרציה

כל שילוב של ה- API Cluster Instrument מורכב משלושה מרכיבים אלה:

  • CarService
  • אפליקציות ניווט
  • שירות אשכולות מכשירים של OEM

רכיבי אינטגרציה

שירות מכוניות

CarService מתווכת בין אפליקציות ניווט המכונית, להבטיח כי רק אפליקציית ניווט אחד פעילה בכול זמן נתון ואפליקציות שהם רק עם android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL הרשות יכולה לשלוח נתונים אל המכונית.

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

עבור יישום אשכול מכשיר, ליצרני OEM בתחום הרכב חייב ליצור יישום מותאם אישית של InstrumentClusterRendererService ולעדכן את config.xml קובץ לנקודה כדי שהיישום אישית.

כאשר עיבוד אשכול Instrument, במהלך תהליך האתחול את CarService קורא את InstrumentClusterRendererService המפתח של config.xml לאתר יישום InstrumentClusterService . ב- AOSP, ערך זה מצביע על שירות ייעוץ של יישום אשכולות מדגם ה- API של מצב הניווט API:

<string name="instrumentClusterRendererService">
android.car.cluster/.ClusterRenderingService
</string>

השירות נזכר ערך זה מאותחל ובהכרח CarService . כאשר אפליקציות ניווט, כמו Google Maps, לבקש CarInstrumentClusterManager , CarService מספק למנהל כי מעדכן את מדינת אשכול המכשיר מן כבול InstrumentClusterRenderingService . (במקרה זה, כבול מתייחס שירותים אנדרואיד .)

שירות אשכולות מכשירים

יצרני ציוד מקורי חייב ליצור חבילת Android (APK) המכיל סדרה של InstrumentClusterRendererService . ראה ClusterRenderingService למדגם.

שיעור זה משרת שתי מטרות:

  • מספק ממשק אנדרואיד והתקן עיבוד האשכולות (מטרת דף זה).
  • מקבל ומעבד עדכוני מצב ניווט, כגון הנחיית ניווט מפורטת.

לצורך הראשון, הטמעות OEM של InstrumentClusterRendererService חייבות לאתחל את התצוגה המשנית משמשת לעיבוד מידע על מסך בתא המכונית ולהעביר מידע זה כדי CarService ידי התקשרות אל InstrumentClusterRendererService.setClusterActivityOptions() ו InstrumentClusterRendererService.setClusterActivityState() שיטות.

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

רצף אינטגרציה

התרשים הבא ממחיש את יישום מצב הניווט המביא עדכונים:

רצף אינטגרציה

באיור זה, הצבעים מציינים את הדברים הבאים:

  • צהוב. CarService ו CarNavigationStatusManager שמספקת פלטפורמת אנדרואיד.
  • טורקיז. InstrumentClusterRendererService מיושם על ידי OEM.
  • סָגוֹל. אפליקציית הניווט המיושמת על ידי גוגל ומפתחי צד שלישי.
  • ירוק. CarAppFocusManager .

זרימת המידע של מצב הניווט עוקבת אחר רצף זה:

  1. CarService מאתחל את InstrumentClusterRenderingService .
  2. במהלך האתחול, את InstrumentClusterRenderingService מעדכנת CarService עם:
    1. מאפייני תצוגה של Cluster Instrument, כגון גבולות לא ברורים (ראה פרטים נוספים על גבולות לא ברורים בהמשך).
    2. אפשרויות פעילות הדרוש לפעילויות הפעלה בתוך תצוגת אשכול המכשיר (ראו פרטים נוספים כאן ActivityOptions .
  3. אפליקציית ניווט (כגון מפות Google ל- Android Automotive או כל אפליקציית מפות עם ההרשאות הנדרשות):
    1. משיג CarAppFocusManager באמצעות המחלקה רכב מ-lib המכונית.
    2. לפני פנייה אחר פנייה להתחיל, שיחות CarAppFocusManager.requestFocus() כדי לעבור CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION כמו appType פרמטר.
  4. CarAppFocusManager מתקשר לבקשה זו כדי CarService . אם כמובן מאליו, CarService בודק את החבילה אפליקציית ניווט ו מאתרת פעילות המסומנים בקטגוריה android.car.cluster.NAVIGATION .
  5. אם נמצא, אפליקציית הניווט משתמשת ActivityOptions שדווח על ידי InstrumentClusterRenderingService להשיק את הפעילות כוללת את מאפייני תצוגת אשכול המכשיר כניצבי ההכוונה.

שילוב ה- API

InstrumentClusterRenderingService חובת היישום:

  • הוגדר כשירות סינגלטון על ידי הוספת הערך הבא ל- AndroidManifest.xml. זה הכרחי כדי להבטיח שהעותק יחיד של שירות אשכול המכשירים יפעל, גם במהלך אתחול והחלפת משתמשים:
    android:singleUser="true"
  • החזק את BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE רשות המערכת. ערבויות זה שרק שירות עיבוד אשכול מכשיר כלולים כחלק תמונת מערכת אנדרואיד הוא כבול פעם על ידי CarService :
    <uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
    

יישום InstrumentClusterRenderingService

לבניית השירות:

  1. כתוב בכיתה המשתרע מן InstrumentClusterRenderingService ולאחר מכן להוסיף רשומה המתאימה שלך AndroidManifest.xml קובץ. בכיתה זו שולטת תצוגת אשכול המכשיר ויכולה (אופציונאלי) לעבד נתוני API מדינת הניווט.
  2. במהלך onCreate() , להשתמש בשירות זה כדי לאתחל את התקשורת עם חומרת הטיוח. האפשרויות כוללות:
    • קבע את המסך המשני שישמש עבור אשכול המכשירים.
    • צור תצוגה וירטואלית כך שאפליקציית Cluster Instrument תעבד ותעביר את התמונה המעובדת ליחידה חיצונית (באמצעות פורמט הזרמת וידאו, כגון H.264).
  3. כאשר התצוגה שצוינה לעיל הוא מוכן, שירות זה חייב להתקשר InstrumentClusterRenderingService#setClusterActivityLaunchOptions() כדי להגדיר את היעד המדויק ActivityOptions כי יש להשתמש כדי להציג פעילות על אשכול המכשיר. השתמש בפרמטרים אלה:
    • קטגוריה. CarInstrumentClusterManager#CATEGORY_NAVIGATION
    • ActivityOptions. ActivityOptions למשל, שניתן להשתמש בהם כדי להפעיל פעילות של אשכול מכשיר. לדוגמה, מיישום מדגם Instrument Cluster על AOSP:
      getService().setClusterActivityLaunchOptions(
         CATEGORY_NAVIGATION,
         ActivityOptions.makeBasic()
            .setLaunchDisplayId(displayId));
      
  4. כאשר אשכול המכשיר מוכן להציג פעילויות, שירות זה חייב להפעיל InstrumentClusterRenderingService#setClusterActivityState() . השתמש בפרמטרים אלה:
    • category CarInstrumentClusterManager#CATEGORY_NAVIGATION
    • state Bundle שנוצרה עם ClusterActivityState . הקפד לספק את הנתונים הבאים:
      • visible מציין אשכול Instrument כפי הנראה מוכן להציג תוכן.
      • unobscuredBounds מלבן המגדיר את השטח בתוך תצוגת אשכול המכשיר שבו זה בטוח להציג תוכן. למשל אזורים המכוסים בחוגים ומדדים.
  5. דרוס את Service#dump() מידע מצב השיטה דו"ח יעיל לאיתור באגים (ראה dumpsys למידע נוסף).

יישום מדגם InstrumentClusterRenderingService

הדוגמה הבאה מתווה InstrumentClusterRenderingService יישום, אשר יוצרת VirtualDisplay להציג את תוכן אשכול מכשיר על צג פיזי מרוחק.

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

/**
* Sample {@link InstrumentClusterRenderingService} implementation
*/
public class SampleClusterServiceImpl extends InstrumentClusterRenderingService {
   // Used to retrieve or create displays
   private final DisplayManager mDisplayManager;
   // Unique identifier for the display that will be used for instrument
   // cluster
   private final String mUniqueId = UUID.randomUUID().toString();
   // Format of the instrument cluster display
   private static final int DISPLAY_WIDTH = 1280;
   private static final int DISPLAY_HEIGHT = 720;
   private static final int DISPLAY_DPI = 320;
   // Area not covered by instruments
   private static final int DISPLAY_UNOBSCURED_LEFT = 40;
   private static final int DISPLAY_UNOBSCURED_TOP = 0;
   private static final int DISPLAY_UNOBSCURED_RIGHT = 1200;
   private static final int DISPLAY_UNOBSCURED_BOTTOM = 680;
   @Override
   public void onCreate() {
      super.onCreate();
      // Create a virtual display to render instrument cluster activities on
      mDisplayManager = getSystemService(DisplayManager.class);
      VirtualDisplay display = mDisplayManager.createVirtualDisplay(
          mUniqueId, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_DPI, null,
          0 /* flags */, null, null);
      // Do any additional initialization (e.g.: start a video stream
      // based on this virtual display to present activities on a remote
      // display).
      onDisplayReady(display.getDisplay());
}
private void onDisplayReady(Display display) {
    // Report activity options that should be used to launch activities on
    // the instrument cluster.
    String category = CarInstrumentClusterManager.CATEGORY_NAVIGATION;
    ActionOptions options = ActivityOptions.makeBasic()
        .setLaunchDisplayId(display.getDisplayId());
    setClusterActivityOptions(category, options);
    // Report instrument cluster state.
    Rect unobscuredBounds = new Rect(DISPLAY_UNOBSCURED_LEFT,
        DISPLAY_UNOBSCURED_TOP, DISPLAY_UNOBSCURED_RIGHT,
        DISPLAY_UNOBSCURED_BOTTOM);
    boolean visible = true;
    ClusterActivityState state = ClusterActivityState.create(visible,
       unobscuredBounds);
    setClusterActivityState(category, options);
  }
}

שימוש ב- CarAppFocusManager

ה- API CarAppFocusManager מספק שיטה בשם getAppTypeOwner() , אשר מאפשר השירות באשכול שנכתב על ידי יצרני ציוד מקורי לדעת באיזו אפליקציית ניווט יש מוקד ניווט בכל זמן נתון. יצרני ציוד מקורי יכולים להשתמש הקיימים CarAppFocusManager#addFocusListener() שיטה, ולאחר מכן להשתמש getAppTypeOwner() כדי ללמוד אילו יש אפליקציה הפוקוס. בעזרת מידע זה, יצרני OEM יכולים:

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

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

השתמש CarAppFocusManager#addFocusListener(..) השיטה להקשיב לשינויי מוקד אפליקציה:

import android.car.CarAppFocusManager;

...

Car car = Car.createCar(this);
mAppFocusManager = (CarAppFocusManager)car.getCarManager(Car.APP_FOCUS_SERVICE);
mAppFocusManager.addFocusListener(this, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);

...

public void onAppFocusChanged(int appType, boolean active) {
    // Use the CarAppFocusManager#getAppTypeOwner(appType) method call
    // to retrieve a list of active package names
}

השתמש CarAppFocusManager#getAppTypeOwner(..) שיטה כדי לאחזר את שמות חבילה של הבעלים הנוכחי של סוג יישום נתון כי הוא בפוקוס. שיטה זו עשויה להחזיר יותר משם חבילה אחת אם הבעלים הנוכחי משתמש android:sharedUserId תכונה.

import android.car.CarAppFocusManager;

...

Car car = Car.createCar(this);
mAppFocusManager = (CarAppFocusManager)car.getCarManager(Car.APP_FOCUS_SERVICE);
List<String> focusOwnerPackageNames = mAppFocusManager.getAppTypeOwner(
              CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);

if (focusOwnerPackageNames == null || focusOwnerPackageNames.isEmpty()) {
        // No Navigation application has focus
        // OEM may choose to show their default cluster view
} else {
       // focusOwnerPackageNames
       // Use the PackageManager to retrieve the cluster activity for the package(s)
       // returned in focusOwnerPackageNames
}

...

נספח: שימוש ביישום לדוגמה

AOSP מספק יישום לדוגמה המיישם את ממשק ה- API של מצב הניווט.

כדי להריץ יישום לדוגמה זה:

  1. בנה והבהב את Android Auto ב- HU נתמך. השתמש בהוראות הבנייה וההבהבה של Android הספציפיות למכשיר שלך. לקבלת הוראות, ראה שימוש לוחות הפניה .
  2. חבר צג משני פיזי ל- HU (אם נתמך) או הפעל את ה- HU המשני הווירטואלי:
    1. מצב בחר מפתחים ביישום ההגדרות.
    2. עבור אל הגדרות> מערכת> מתקדם> אפשרויות למפתחים> בתצוגות משניות לדמות.
  3. הפעל מחדש את HU. ClusterRenderingService השירות מחובר התצוגה המשנית.
  4. להפעלת אפליקציית KitchenSink:
    1. פתח את המגירה.
    2. עבור אל Inst. אשכול.
    3. לחץ על התחל מטה.

KitchenSink מבקש מוקד NAVIGATION, אשר מנחה את DirectRenderingCluster השירות לתצוגת ממשק משתמש לעג-אפ על אשכול המכשיר.