פיתוח אפליקציית ניווט

בדף הזה מפורטות התכונות השונות של ספריית האפליקציות לרכב שבהן אפשר להשתמש כדי להטמיע את הפונקציונליות של אפליקציית הניווט במסלול המפורט.

הצהרה על תמיכה בניווט במניפסט

אפליקציית הניווט שלך צריכה להצהיר על androidx.car.app.category.NAVIGATION קטגוריית אפליקציה של רכב ב-Intent מסנן CarAppService שלו:

<application>
    ...
   <service
       ...
        android:name=".MyNavigationCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.NAVIGATION"/>
      </intent-filter>
    </service>
    ...
</application>

תמיכה בכוונות ניווט

כדי לתמוך בכוונות ניווט אל האפליקציה, כולל אלה שמגיעות מ: ל-Google Assistant באמצעות שאילתה קולית, האפליקציה שלך צריכה לטפל CarContext.ACTION_NAVIGATE ב-Intent שלו Session.onCreateScreen וגם Session.onNewIntent.

ניתן לעיין במסמכי התיעוד בנושא CarContext.startCarApp לפרטים על הפורמט של הכוונה.

איך ניגשים לתבניות הניווט

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

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

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

כדי לקבל גישה לתבניות הניווט, האפליקציה שלך צריכה להצהיר (declare) על האפליקציה את ההרשאה androidx.car.app.NAVIGATION_TEMPLATES קובץ AndroidManifest.xml:

<manifest ...>
  ...
  <uses-permission android:name="androidx.car.app.NAVIGATION_TEMPLATES"/>
  ...
</manifest>

כדי לצייר מפות נדרשת הרשאה נוספת.

מעבר אל MapWithContentTemplate

החל מגרסה 7 של Car App API, MapTemplate PlaceListNavigationTemplate, ו-RoutePreviewNavigationTemplate הוצאו משימוש. נמשיך לתמוך בתבניות שהוצאו משימוש, אבל מומלץ מאוד לעבור אל MapWithContentTemplate.

ניתן להטמיע את הפונקציונליות שהתבניות האלה מספקות באמצעות MapWithContentTemplate. אפשר לעיין בקטעי הקוד הבאים כדי לראות דוגמאות:

תבנית מפה

Kotlin

// MapTemplate (deprecated)
val template = MapTemplate.Builder()
    .setPane(paneBuilder.build())
    .setActionStrip(actionStrip)
    .setHeader(header)
    .setMapController(mapController)
    .build()

// MapWithContentTemplate
val template = MapWithContentTemplate.Builder()
    .setContentTemplate(
        PaneTemplate.Builder(paneBuilder.build())
            .setHeader(header)
            .build())
    .setActionStrip(actionStrip)
    .setMapController(mapController)
    .build()

Java

// MapTemplate (deprecated)
MapTemplate template = new MapTemplate.Builder()
    .setPane(paneBuilder.build())
    .setActionStrip(actionStrip)
    .setHeader(header)
    .setMapController(mapController)
    .build();

// MapWithContentTemplate
MapWithContentTemplate template = new MapWithContentTemplate.Builder()
    .setContentTemplate(new PaneTemplate.Builder(paneBuilder.build())
        .setHeader(header)
        build())
    .setActionStrip(actionStrip)
    .setMapController(mapController)
    .build();

PlaceListNavigationTemplate

Kotlin

// PlaceListNavigationTemplate (deprecated)
val template = PlaceListNavigationTemplate.Builder()
    .setItemList(itemListBuilder.build())
    .setHeader(header)
    .setActionStrip(actionStrip)
    .setMapActionStrip(mapActionStrip)
    .build()

// MapWithContentTemplate
val template = MapWithContentTemplate.Builder()
    .setContentTemplate(
        ListTemplate.Builder()
            .setSingleList(itemListBuilder.build())
            .setHeader(header)
            .build())
    .setActionStrip(actionStrip)
    .setMapController(
        MapController.Builder()
            .setMapActionStrip(mapActionStrip)
            .build())
    .build()

Java

// PlaceListNavigationTemplate (deprecated)
PlaceListNavigationTemplate template = new PlaceListNavigationTemplate.Builder()
    .setItemList(itemListBuilder.build())
    .setHeader(header)
    .setActionStrip(actionStrip)
    .setMapActionStrip(mapActionStrip)
    .build();

// MapWithContentTemplate
MapWithContentTemplate template = new MapWithContentTemplate.Builder()
    .setContentTemplate(new ListTemplate.Builder()
        .setSingleList(itemListBuilder.build())
        .setHeader(header)
        .build())
    .setActionStrip(actionStrip)
    .setMapController(new MapController.Builder()
        .setMapActionStrip(mapActionStrip)
        .build())
    .build();

RoutePreviewNavigationTemplate: תבנית

Kotlin

// RoutePreviewNavigationTemplate (deprecated)
val template = RoutePreviewNavigationTemplate.Builder()
    .setItemList(
        ItemList.Builder()
            .addItem(
                Row.Builder()
                    .setTitle(title)
                    .build())
            .build())
    .setHeader(header)
    .setNavigateAction(
        Action.Builder()
            .setTitle(actionTitle)
            .setOnClickListener { ... }
            .build())
    .setActionStrip(actionStrip)
    .setMapActionStrip(mapActionStrip)
    .build()

// MapWithContentTemplate
val template = MapWithContentTemplate.Builder()
    .setContentTemplate(
        ListTemplate.Builder()
            .setSingleList(
                ItemList.Builder()
                    .addItem(
                        Row.Builder()
                            .setTitle(title)
                            .addAction(
                                Action.Builder()
                                    .setTitle(actionTitle)
                                    .setOnClickListener { ... }
                                    .build())
                            .build())
                    .build())
            .setHeader(header)
            .build())
    .setActionStrip(actionStrip)
    .setMapController(
        MapController.Builder()
            .setMapActionStrip(mapActionStrip)
            .build())
    .build()

Java

// RoutePreviewNavigationTemplate (deprecated)
RoutePreviewNavigationTemplate template = new RoutePreviewNavigationTemplate.Builder()
    .setItemList(new ItemList.Builder()
        .addItem(new Row.Builder()
            .setTitle(title))
            .build())
        .build())
    .setHeader(header)
    .setNavigateAction(new Action.Builder()
        .setTitle(actionTitle)
        .setOnClickListener(() -> { ... })
        .build())
    .setActionStrip(actionStrip)
    .setMapActionStrip(mapActionStrip)
    .build();

// MapWithContentTemplate
MapWithContentTemplate template = new MapWithContentTemplate.Builder()
    .setContentTemplate(new ListTemplate.Builder()
        .setSingleList(new ItemList.Builder()
            .addItem(new Row.Builder()
                  .setTitle(title))
                  .addAction(new Action.Builder()
                      .setTitle(actionTitle)
                      .setOnClickListener(() -> { ... })
                      .build())
                  .build())
            .build()))
        .setHeader(header)
        .build())
    .setActionStrip(actionStrip)
    .setMapController(new MapController.Builder()
        .setMapActionStrip(mapActionStrip)
        .build())
    .build();

אפליקציות ניווט חייבות להעביר מטא-נתונים נוספים לגבי הניווט עם מארח. המארח משתמש במידע כדי לספק מידע היחידה הראשית (HU) של הרכב ולמנוע התנגשות של אפליקציות ניווט במשאבים משותפים.

מטא-נתונים של ניווט מסופקים באמצעות NavigationManager שירות מכוניות שניתן לגשת אליו CarContext:

Kotlin

val navigationManager = carContext.getCarService(NavigationManager::class.java)

Java

NavigationManager navigationManager = carContext.getCarService(NavigationManager.class);

התחלה, סיום ועצירה של הניווט

כדי שהמארח ינהל כמה אפליקציות ניווט, התראות ניתוב, ונתונים של אשכול הרכבים, הם צריכים להיות מודעים למצב הנוכחי של ניווט. כשמשתמש מתחיל את הניווט, התקשר NavigationManager.navigationStarted באותו אופן, כשהניווט מסתיים – לדוגמה, כשהמשתמש מגיע יעד או שהמשתמש יבטל את הניווט — התקשר NavigationManager.navigationEnded

התקשרות רק אל NavigationManager.navigationEnded כשהמשתמש מסיים לנווט. לדוגמה, אם צריך לחשב מחדש המסלול באמצע הנסיעה, השתמשו Trip.Builder.setLoading(true) במקום זאת.

מדי פעם, למארח נדרש אפליקציה כדי להפסיק את הניווט והשיחות onStopNavigation תוך NavigationManagerCallback שסופק על ידי האפליקציה באמצעות NavigationManager.setNavigationManagerCallback. לאחר מכן האפליקציה חייבת להפסיק להנפיק מידע לגבי הפנייה הבאה בתצוגת האשכול הודעות ניווט והנחיות קוליות.

עדכון פרטי הנסיעה

במהלך הניווט הפעיל, מבצעים שיחה NavigationManager.updateTrip המידע שנמסר בשיחה הזו יכול לשמש את אשכול הרכב וגם ובתצוגה עילית. לא כל הרכבים משתנים, בהתאם לרכב המידע מוצג למשתמש. לדוגמה, יחידת הראש למחשב (DHU) מראה Step שהתווסף Trip, אבל לא מופיע ה-Destination מידע.

שרטוט של תצוגת האשכול

כדי לספק את חוויית המשתמש הסוחפת ביותר, הצגת מטא-נתונים בסיסיים במסך אשכול הרכב. החל מרמה 6 של Car App API, באפליקציות ניווט יש אפשרות לבצע רינדור את התוכן שלהם ישירות במסך האשכול (בכלי רכב נתמכים), וכן המגבלות הבאות:

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

הצהרה על תמיכה באשכול

כדי להודיע לאפליקציה המארחת שהאפליקציה שלך תומכת בעיבוד באשכול מסכים, עליך להוסיף androidx.car.app.category.FEATURE_CLUSTER רכיב <category> ל-<intent-filter> של CarAppService כמו שמוצג קטע הקוד הבא:

<application>
    ...
   <service
       ...
        android:name=".MyNavigationCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.NAVIGATION"/>
        <category android:name="androidx.car.app.category.FEATURE_CLUSTER"/>
      </intent-filter>
    </service>
    ...
</application>

ניהול מחזור חיים ומצב

החל מרמת API 6, האפליקציה לרכב זרימת מחזור חיים נשאר ללא שינוי, אבל עכשיו CarAppService::onCreateSession לוקח פרמטר של מקלידים SessionInfo שמספקים מידע נוסף על Session שנוצר (כלומר, התצוגה הסוג והקבוצה של התבניות הנתמכות).

לאפליקציות יש אפשרות להשתמש באותה מחלקה Session כדי לטפל גם אשכול ומסך ראשי, או ליצור Sessions ספציפי למסך כדי להתאים אישית בכל תצוגה (כפי שמוצג בקטע הקוד הבא).

Kotlin

override fun onCreateSession(sessionInfo: SessionInfo): Session {
  return if (sessionInfo.displayType == SessionInfo.DISPLAY_TYPE_CLUSTER) {
    ClusterSession()
  } else {
    MainDisplaySession()
  }
}

Java

@Override
@NonNull
public Session onCreateSession(@NonNull SessionInfo sessionInfo) {
  if (sessionInfo.getDisplayType() == SessionInfo.DISPLAY_TYPE_CLUSTER) {
    return new ClusterSession();
  } else {
    return new MainDisplaySession();
  }
}

אנחנו לא יכולים להבטיח מתי או אם צג האשכול מסופק, וכן יכול להיות גם שהאשכול Session יהיה ה-Session היחיד (עבור לדוגמה, המשתמש החליף את המסך הראשי לאפליקציה אחרת בזמן שהאפליקציה שלכם בניווט פעיל). העמודה "רגילה" היא שהאפליקציה מקבלת שליטה הצגת אשכול רק אחרי NavigationManager::navigationStarted שנקראה. עם זאת, יכול להיות שהאפליקציה תקבל את תצוגת האשכול בזמן שלא מתרחש ניווט פעיל, או שהאשכול לעולם לא יסופק מסך. האפליקציה שלך צריכה לטפל בתרחישים האלה על ידי עיבוד של מצב לא פעיל של קטעי המפה.

המארח יוצר קישור נפרד ומופעי CarContext לכל Session. הזה כלומר, כשמשתמשים בשיטות כמו ScreenManager::push או Screen::invalidate, רק ה-Session שממנו הן נקראות הושפעו. האפליקציות צריכות ליצור ערוצי תקשורת משלהן בין אם נדרשת תקשורת בין Session (לדוגמה, באמצעות שידורים, סינגלטון משותף או משהו אחר).

תמיכה באשכולות

אפשר לבדוק את ההטמעה ב-Android Auto וגם ב-Android Automotive OS. ב-Android Auto, אפשר לעשות זאת על ידי הגדרת האמולציה של היחידה הראשית לשולחן העבודה תצוגת אשכול משני. עבור את Android Automotive OS, תמונות מערכת גנריות ל-API ברמה 30 ואילך לאמולציה של תצוגת אשכול.

התאמה אישית של Travelassess באמצעות טקסט או סמל

כדי להתאים אישית את האומדן של הנסיעה בעזרת טקסט, סמל או שניהם, משתמשים TravelEstimate.Builder של הכיתה setTripIcon או setTripText שיטות. NavigationTemplate משתמשת TravelEstimate כדי להגדיר טקסט וסמלים לצד הזמן המשוער או במקומו שעת ההגעה, הזמן שנותר והמרחק שנותר.

איור 1. הערכת נסיעה עם סמל וטקסט בהתאמה אישית.

קטע הקוד הבא משתמש ב-setTripIcon וב-setTripText כדי להתאים אישית את אומדן לנסיעה:

Kotlin

TravelEstimate.Builder(Distance.create(...), DateTimeWithZone.create(...))
      ...
      .setTripIcon(CarIcon.Builder(...).build())
      .setTripText(CarText.create(...))
      .build()

Java

new TravelEstimate.Builder(Distance.create(...), DateTimeWithZone.create(...))
      ...
      .setTripIcon(CarIcon.Builder(...).build())
      .setTripText(CarText.create(...))
      .build();

הצגת מסלול מפורט

לספק הוראות ניווט מפורטות (TBT) באמצעות התראת ניווט מעודכנת. כדי שיטופלו כניווט במסך המכונית, יוצר ההתראות צריך לבצע הבאים:

  1. מסמנים את ההתראה כהתראה מתמשכת באמצעות NotificationCompat.Builder.setOngoing .
  2. מגדירים את קטגוריית ההתראה לNotification.CATEGORY_NAVIGATION.
  3. הארכת ההתראה באמצעות CarAppExtender

התראת ניווט מוצגת בווידג'ט הרכבת שבחלק התחתון של במסך המכונית. אם רמת החשיבות של ההתראה מוגדרת לערך IMPORTANCE_HIGH, הוא מוצג גם כהתראה 'שימו לב' (HUN). אם לא מגדירים חשיבות עם CarAppExtender.Builder.setImportance את ה-method החשיבות של ערוץ ההתראות נעשה שימוש.

האפליקציה יכולה להגדיר PendingIntent ב CarAppExtender ש נשלחת לאפליקציה כשהמשתמש מקיש על HUN או על ווידג'ט הרכבת.

אם המיקום NotificationCompat.Builder.setOnlyAlertOnce נקרא עם הערך true, התראה על חשיבות גבוהה מיועדת רק להתראה על חשיבות גבוהה פעם ב-HUN.

בקטע הבא מוסבר איך ליצור התראת ניווט:

Kotlin

NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    ...
    .setOnlyAlertOnce(true)
    .setOngoing(true)
    .setCategory(NotificationCompat.CATEGORY_NAVIGATION)
    .extend(
        CarAppExtender.Builder()
            .setContentTitle(carScreenTitle)
            ...
            .setContentIntent(
                PendingIntent.getBroadcast(
                    context,
                    ACTION_OPEN_APP.hashCode(),
                    Intent(ACTION_OPEN_APP).setComponent(
                        ComponentName(context, MyNotificationReceiver::class.java)),
                        0))
            .setImportance(NotificationManagerCompat.IMPORTANCE_HIGH)
            .build())
    .build()

Java

new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    ...
    .setOnlyAlertOnce(true)
    .setOngoing(true)
    .setCategory(NotificationCompat.CATEGORY_NAVIGATION)
    .extend(
        new CarAppExtender.Builder()
            .setContentTitle(carScreenTitle)
            ...
            .setContentIntent(
                PendingIntent.getBroadcast(
                    context,
                    ACTION_OPEN_APP.hashCode(),
                    new Intent(ACTION_OPEN_APP).setComponent(
                        new ComponentName(context, MyNotificationReceiver.class)),
                        0))
            .setImportance(NotificationManagerCompat.IMPORTANCE_HIGH)
            .build())
    .build();

לעדכן את ההתראה TBT באופן קבוע לגבי המרחק שמעדכנים את ווידג'ט הרכבת, ומציגים את ההתראה רק כ-HUN. אפשר לשלוט בהתנהגות HUN באמצעות הגדרת חשיבות ההתראה באמצעות CarAppExtender.Builder.setImportance הגדרת החשיבות כ ב-IMPORTANCE_HIGH רואים HUN. ההגדרה לכל ערך אחר שרק יעדכן את ווידג'ט הרכבת.

רענון התוכן של PlaceListNavigationTemplate

אתם יכולים לאפשר לנהגים לרענן תוכן בהקשת לחצן במהלך הגלישה רשימות של מקומות שנבנו באמצעות PlaceListNavigationTemplate כדי להפעיל רענון של רשימות, צריך להטמיע את OnContentRefreshListener ממשק onContentRefreshRequested שיטה ושימוש PlaceListNavigationTemplate.Builder.setOnContentRefreshListener כדי להגדיר את ה-listener בתבנית.

בקטע הבא מוסבר איך להגדיר את ה-listener בתבנית:

Kotlin

PlaceListNavigationTemplate.Builder()
    ...
    .setOnContentRefreshListener {
        // Execute any desired logic
        ...
        // Then call invalidate() so onGetTemplate() is called again
        invalidate()
    }
    .build()

Java

new PlaceListNavigationTemplate.Builder()
        ...
        .setOnContentRefreshListener(() -> {
            // Execute any desired logic
            ...
            // Then call invalidate() so onGetTemplate() is called again
            invalidate();
        })
        .build();

לחצן הרענון מוצג רק בכותרת של PlaceListNavigationTemplate אם למאזינים יש ערך.

כשהמשתמש לוחץ על לחצן הרענון, אמצעי תשלום אחד (onContentRefreshRequested) מתבצעת קריאה להטמעה של OnContentRefreshListener. בטווח של onContentRefreshRequested, קוראים לפונקציה Screen.invalidate. אחר כך המארח מתקשר חזרה לאפליקציה Screen.onGetTemplate כדי לאחזר את התבנית עם התוכן שעבר רענון. צפייה רענון התוכן של תבנית עבור מידע נוסף על רענון תבניות. כל עוד התבנית הבאה הוחזר על ידי onGetTemplate הוא מתוך מאותו סוג, זה נחשב כרענון ולא נכלל במכסת התבניות.

מתן הנחיות קוליות

כדי להפעיל את הוראות הניווט דרך הרמקולים של הרכב, האפליקציה צריכה לבקש מיקוד אודיו. כחלק AudioFocusRequest, קבוצה השימוש בתור AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE. כמו כן, להגדיר את רווח הפוקוס כ-AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK.

הדמיה של ניווט

כדי לאמת את פונקציית הניווט של האפליקציה כששולחים אותה אל בחנות Google Play, באפליקציה צריך להטמיע את NavigationManagerCallback.onAutoDriveEnabled קריאה חוזרת. כשמתבצעת קריאה חוזרת (callback) של האפליקציה, האפליקציה צריכה לדמות ניווט אל היעד שנבחר כשהמשתמש מתחיל בניווט. אפשר לצאת מהאפליקציה הזו במצב הנוכחי בכל פעם שמחזור החיים של Session הנוכחי מגיע אל Lifecycle.Event.ON_DESTROY .

אפשר לבדוק שההטמעה של onAutoDriveEnabled נקראת על ידי הרצת הפקודה הבאה משורת הפקודה:

adb shell dumpsys activity service CAR_APP_SERVICE_NAME AUTO_DRIVE

אפשר לראות זאת בדוגמה הבאה:

adb shell dumpsys activity service androidx.car.app.samples.navigation.car.NavigationCarAppService AUTO_DRIVE

אפליקציית ברירת המחדל לרכב

ב-Android Auto, אפליקציית הניווט במכונית שמוגדרת כברירת מחדל תואמת אפליקציית הניווט שהמשתמש הפעיל. אפליקציית ברירת המחדל מקבל כוונות ניווט כשהמשתמש מפעילה פקודות ניווט דרך Assistant או כשאפליקציה אחרת שולחת כוונה להתחיל בניווט.

הצגת התראות ניווט לפי הקשר

ב-Alert מוצג 'חשוב' מידע לנהג עם פעולות אופציונליות&dash;בלי לצאת מההקשר של במסך הניווט. כדי לספק לנהג את החוויה הטובה ביותר, Alert פועל במסגרת NavigationTemplate כדי להימנע מחסימת מסלול הניווט ולצמצם את הסחות הדעת של הנהג.

Alert זמין רק בNavigationTemplate. כדי לשלוח הודעה למשתמש מחוץ ל-NavigationTemplate, מומלץ להשתמש בהתראה 'שימו לב' (HUN), כפי שמוסבר ב הצגת התראות.

לדוגמה, אפשר להשתמש ב-Alert כדי:

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

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

איור 2. התראת ניווט לפי הקשר.

אחרי ש-Alert מוצג, הוא לא מועבר לתבנית אחרת אם האינטראקציה של הנהג/ת מובילה ליציאה מNavigationTemplate. הוא יישאר בגרסה המקורית של NavigationTemplate עד לסיום הזמן הקצוב לתפוגה של Alert, המשתמש תבצע פעולה, או שהאפליקציה תסגור את Alert.

יצירת התראה

שימוש ב-Alert.Builder כדי ליצור מכונה של Alert:

Kotlin

Alert.Builder(
        /*alertId*/ 1,
        /*title*/ CarText.create("Hello"),
        /*durationMillis*/ 5000
    )
    // The fields below are optional
    .addAction(firstAction)
    .addAction(secondAction)
    .setSubtitle(CarText.create(...))
    .setIcon(CarIcon.APP_ICON)
    .setCallback(...)
    .build()

Java

new Alert.Builder(
        /*alertId*/ 1,
        /*title*/ CarText.create("Hello"),
        /*durationMillis*/ 5000
    )
    // The fields below are optional
    .addAction(firstAction)
    .addAction(secondAction)
    .setSubtitle(CarText.create(...))
    .setIcon(CarIcon.APP_ICON)
    .setCallback(...)
    .build();

אם ברצונך להאזין לAlert לביטול או סגירה, ליצור יישום של ממשק AlertCallback. נתיבי השיחות של AlertCallback הם:

הגדרת משך ההתראה

צריך לבחור משך זמן של Alert תואם לצורכי האפליקציה שלכם. משך הזמן המומלץ לניווט משך הזמן של Alert הוא 10 שניות. מידע נוסף זמין בקטע התראות ניווט. אפשר לקבל מידע נוסף.

הצגת התראה

כדי להציג Alert, צריך להתקשר אל AppManager.showAlert שזמינות דרך CarContext.

// Show an alert
carContext.getCarService(AppManager.class).showAlert(alert)
  • שיחה אל showAlert באמצעות Alert עם alertId שזהה למזהה של Alert שמוצג כרגע, לא עושה דבר. המכשיר Alert לא מתעדכן. כדי לעדכן Alert, צריך ליצור מחדש אותו עם alertId חדש.
  • שיחה אל showAlert באמצעות Alert עם alertId מהסכום שמוצג כרגע ב-Alert סוגר את Alert מוצגים כרגע.

סגירת התראה

כאשר Alert נסגר באופן אוטומטי עקב הזמן הקצוב לתפוגה או עקב אינטראקציה עם הנהג, אפשר גם לסגור באופן ידני Alert, למשל אם המידע שלו הופך ללא עדכני. כדי לדחות Alert, קוראים לפונקציה dismissAlert עם alertId של Alert.

// Dismiss the same alert
carContext.getCarService(AppManager.class).dismissAlert(alert.getId())

שיחה אל dismissAlert עם alertId שלא תואם כרגע שמוצג Alert לא עושה דבר. היא לא גורמת לחריגה.