Navigasyon uygulaması oluşturma

Bu sayfada, adım adım yol tarifi navigasyon uygulamanızın işlevini uygulamak için kullanabileceğiniz Araç Uygulama Kitaplığı'nın farklı özellikleri ayrıntılı olarak açıklanmaktadır.

Manifest'inizde gezinme desteğini belirtme

Navigasyon uygulamanızın, CarAppService manifest dosyasının intent filtresinde androidx.car.app.category.NAVIGATION araç uygulaması kategorisini belirtmesi gerekir:

<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>

Gezinme intent'lerini destekleme

Google Asistan'dan sesli sorgu kullanarak gelenler de dahil olmak üzere uygulamanıza yönelik gezinme intent'lerini desteklemek için uygulamanızın CarContext.ACTION_NAVIGATESession.onCreateScreen ve Session.onNewIntent içinde intent'i işlemesi gerekir.

Intent'in biçimiyle ilgili ayrıntılar için CarContext.startCarApp ile ilgili dokümanları inceleyin.

Gezinme şablonlarına erişme

Navigasyon uygulamaları, arka planda haritayı ve etkin navigasyon sırasında adım adım yol tariflerini gösteren aşağıdaki şablonlara erişebilir.

  • NavigationTemplate: Etkin navigasyon sırasında isteğe bağlı bir bilgi mesajı ve seyahat tahminleri de gösterir.
  • MapWithContentTemplate: Bir uygulamanın harita karolarını bir tür içerikle (ör. liste) oluşturmasına olanak tanıyan bir şablon. İçerik genellikle harita karolarının üzerine yerleştirilen bir yer paylaşımı olarak oluşturulur. Bu durumda harita görünür durumdadır ve sabit alanlar içeriğe göre ayarlanır.

Bu şablonları kullanarak navigasyon uygulamanızın kullanıcı arayüzünü tasarlama hakkında daha fazla bilgi için Navigasyon uygulamaları başlıklı makaleyi inceleyin.

Navigasyon şablonlarına erişmek için uygulamanızın AndroidManifest.xml dosyasında androidx.car.app.NAVIGATION_TEMPLATES iznini beyan etmesi gerekir:

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

Harita çizmek için ek izin gerekir.

MapWithContentTemplate'a taşıma

Car App API 7. düzeyinden itibaren MapTemplate, PlaceListNavigationTemplate ve RoutePreviewNavigationTemplate desteği sonlandırılmıştır. Desteği sonlandırılan şablonlar desteklenmeye devam edecek olsa da MapWithContentTemplate'e geçmeniz önemle tavsiye edilir.

Bu şablonlar tarafından sağlanan işlevler MapWithContentTemplate kullanılarak uygulanabilir. Örnekler için aşağıdaki snippet'lere bakın:

MapTemplate

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();

Navigasyon uygulamaları, barındırıcıyla ek navigasyon meta verilerini paylaşmalıdır. Barındırıcı, bilgileri araç ana birimine bilgi sağlamak ve navigasyon uygulamalarının paylaşılan kaynaklarda çakışmasını önlemek için kullanır.

Gezinme meta verileri, CarContext üzerinden erişilebilen NavigationManager araba hizmeti aracılığıyla sağlanır:

Kotlin

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

Java

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

Navigasyonu başlatma, sonlandırma ve durdurma

Barındırıcının birden fazla navigasyon uygulamasını, yönlendirme bildirimlerini ve araç kümesi verilerini yönetebilmesi için navigasyonun mevcut durumundan haberdar olması gerekir. Kullanıcı navigasyona başladığında NavigationManager.navigationStarted işlevini çağırın. Benzer şekilde, gezinme sona erdiğinde (ör. kullanıcı varış noktasına ulaştığında veya gezinmeyi iptal ettiğinde) NavigationManager.navigationEnded işlevini çağırın.

NavigationManager.navigationEnded işlevini yalnızca kullanıcı gezinmeyi tamamladığında çağırın. Örneğin, bir seyahatin ortasında rotayı yeniden hesaplamanız gerekiyorsa bunun yerine Trip.Builder.setLoading(true) simgesini kullanın.

Bazen düzenleyenin, gezinmeyi durdurması ve uygulamanız tarafından sağlanan bir NavigationManagerCallback nesnesinde onStopNavigation çağrısı yapması gerekir. Bu durumda, NavigationManager.setNavigationManagerCallback üzerinden uygulamanızın sağladığı bir nesneyi kullanabilirsiniz. Ardından uygulama, grup ekranında sonraki dönüş bilgilerini, navigasyon bildirimlerini ve sesli rehberliği yayınlamayı durdurmalıdır.

Seyahat bilgilerini güncelleme

Aktif navigasyon sırasında NavigationManager.updateTrip düğmesine basın. Bu çağrıda sağlanan bilgiler, aracın gösterge grubu ve gösterge ekranları tarafından kullanılabilir. Kullanılan araca bağlı olarak, tüm bilgiler kullanıcıya gösterilmez. Örneğin, masaüstü ana birimi (DHU), Trip'e eklenen Step'i gösterir ancak Destination bilgilerini göstermez.

Küme ekranına çizim yapma

En etkileyici kullanıcı deneyimini sunmak için aracın gösterge panelinde temel meta verileri göstermenin ötesine geçmek isteyebilirsiniz. Car App API 6. Seviye'den itibaren, navigasyon uygulamaları kendi içeriklerini doğrudan gösterge ekranında (desteklenen araçlarda) oluşturma seçeneğine sahiptir. Bununla birlikte, aşağıdaki sınırlamalar geçerlidir:

  • Küme görüntüleme API'si giriş denetimlerini desteklemez
  • Araba uygulaması kalite yönergeleri NF-9: Gösterge ekranında yalnızca harita karoları gösterilmelidir. Bu karolarda isteğe bağlı olarak etkin bir navigasyon rotası gösterilebilir.
  • Grup görüntüleme API'si yalnızca NavigationTemplate değerinin kullanılmasını destekler.
    • Ana ekranların aksine, küme ekranları adım adım talimatlar, ETA kartları ve işlemler gibi tüm NavigationTemplate kullanıcı arayüzü öğelerini tutarlı bir şekilde göstermeyebilir. Harita karoları, tutarlı bir şekilde görüntülenen tek kullanıcı arayüzü öğesidir.

Küme desteğini beyan etme

Ana makine uygulamasına, uygulamanızın küme ekranlarında oluşturmayı desteklediğini bildirmek için aşağıdaki snippet'te gösterildiği gibi CarAppService'nin <intent-filter> bölümüne bir androidx.car.app.category.FEATURE_CLUSTER <category> öğesi eklemeniz gerekir:

<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>

Yaşam döngüsü ve durum yönetimi

API düzeyi 6'dan itibaren, araç uygulaması yaşam döngüsü akışı aynı kalır ancak artık CarAppService::onCreateSession, oluşturulmakta olan Session hakkında ek bilgi (yani görüntüleme türü ve desteklenen şablonlar grubu) sağlayan SessionInfo türündeki bir parametre alır.

Uygulamalar, hem kümeyi hem de ana ekranı işlemek için aynı Session sınıfını kullanma veya her ekrandaki davranışı özelleştirmek için ekrana özel Sessions oluşturma seçeneğine sahiptir (aşağıdaki snippet'te gösterildiği gibi).

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();
  }
}

Küme ekranının ne zaman sağlanacağı veya sağlanıp sağlanmayacağı konusunda herhangi bir garanti yoktur. Ayrıca, Session kümesinin tek Session olması da mümkündür (örneğin, uygulamanız etkin bir şekilde gezinirken kullanıcı ana ekranı başka bir uygulamayla değiştirmiştir). "Standart" anlaşmaya göre, uygulama yalnızca NavigationManager::navigationStarted çağrıldıktan sonra küme görüntülemenin kontrolünü ele alır. Ancak uygulamaya, etkin bir gezinme gerçekleşmezken grup göstergesi sağlanabilir veya grup göstergesi hiç sağlanmayabilir. Uygulamanızın harita karolarının boş durumunu oluşturarak bu senaryoları ele alması gerekir.

Ana makine, her Session için ayrı bir bağlayıcı ve CarContext örneği oluşturur. Bu, ScreenManager::push veya Screen::invalidate gibi yöntemler kullanıldığında yalnızca çağrıldıkları Session öğesinin etkileneceği anlamına gelir. Session uygulamaları arasında iletişim gerekiyorsa uygulamalar bu örnekler arasında kendi iletişim kanallarını oluşturmalıdır (örneğin, yayınlar, paylaşılan tekil nesne veya başka bir şey kullanarak).

Test Kümesi Desteği

Uygulamanızı hem Android Auto hem de Android Automotive OS'te test edebilirsiniz. Android Auto için bu işlem, masaüstü ana birimi ikincil bir grup ekranını taklit edecek şekilde yapılandırarak gerçekleştirilir. Android Automotive OS için API düzeyi 30 ve sonraki sürümlerin genel sistem resimleri, bir küme ekranını taklit eder.

Seyahat Tahmini'ni metin veya simgeyle özelleştirme

Seyahat tahminini metin, simge veya her ikisi ile özelleştirmek için TravelEstimate.Builder sınıfının setTripIcon veya setTripText yöntemlerini kullanın. NavigationTemplate, isteğe bağlı olarak tahmini varış zamanı, kalan süre ve kalan mesafenin yanında veya yerine metin ve simgeler ayarlamak için TravelEstimate öğesini kullanır.

Şekil 1. Özel simge ve metin içeren seyahat tahmini.

Aşağıdaki snippet'te, seyahat tahminini özelleştirmek için setTripIcon ve setTripText kullanılır:

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();

Adım adım yol tarifi bildirimleri sağlama

Sık güncellenen bir navigasyon bildirimi kullanarak adım adım navigasyon talimatları sağlayın. Araba ekranında navigasyon bildirimi olarak değerlendirilmesi için bildiriminizin derleyicisinin aşağıdakileri yapması gerekir:

  1. NotificationCompat.Builder.setOngoing yöntemini kullanarak bildirimi devam eden olarak işaretleyin.
  2. Bildirimin kategorisini Notification.CATEGORY_NAVIGATION olarak ayarlayın.
  3. Bildirimi CarAppExtender ile uzatın.

Araç ekranının alt kısmındaki şerit widget'ında bir navigasyon bildirimi gösterilir. Bildirimin önem düzeyi IMPORTANCE_HIGH olarak ayarlanmışsa uyarı bildirimi (HUN) olarak da gösterilir. Önem, CarAppExtender.Builder.setImportance yöntemiyle ayarlanmazsa bildirim kanalının önemi kullanılır.

Uygulama, CarAppExtender içinde bir PendingIntent ayarlayabilir. Bu PendingIntent, kullanıcı HUN'a veya demiryolu widget'ına dokunduğunda uygulamaya gönderilir.

NotificationCompat.Builder.setOnlyAlertOnce, true değeriyle çağrılırsa yüksek öneme sahip bir bildirim, HUN'da yalnızca bir kez uyarı verir.

Aşağıdaki snippet'te, gezinme bildiriminin nasıl oluşturulacağı gösterilmektedir:

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();

Mesafe değişiklikleri için TBT bildirimini düzenli olarak güncelleyin. Bu işlem, demiryolu widget'ını günceller ve bildirimi yalnızca HUN olarak gösterir. CarAppExtender.Builder.setImportance ile bildirimin önemini ayarlayarak HUN davranışını kontrol edebilirsiniz. Önem düzeyini IMPORTANCE_HIGH olarak ayarladığınızda bir HUN gösterilir. Bu değeri başka bir değere ayarlamak yalnızca rulolu widget'ı günceller.

PlaceListNavigationTemplate içeriğini yenileme

PlaceListNavigationTemplate ile oluşturulan yerlerin listelerine göz atarken sürücülerin bir düğmeye dokunarak içeriği yenilemesine izin verebilirsiniz. Liste yenilemeyi etkinleştirmek için OnContentRefreshListener arayüzünün onContentRefreshRequested yöntemini uygulayın ve dinleyiciyi şablona ayarlamak için PlaceListNavigationTemplate.Builder.setOnContentRefreshListener kullanın.

Aşağıdaki snippet'te, şablonda dinleyicinin nasıl ayarlanacağı gösterilmektedir:

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();

Yenile düğmesi yalnızca dinleyicinin değeri varsa PlaceListNavigationTemplate üstbilgisinde gösterilir.

Kullanıcı yenileme düğmesini tıkladığında, onContentRefreshRequested uygulamanızın OnContentRefreshListener yöntemi çağrılır. onContentRefreshRequested içinde Screen.invalidate yöntemini çağırın. Ardından düzenleyen, yenilenen içeriğe sahip şablonu almak için uygulamanızın Screen.onGetTemplate yöntemini tekrar çağırır. Şablonları yenileme hakkında daha fazla bilgi için Şablon içeriğini yenileme başlıklı makaleyi inceleyin. onGetTemplate tarafından döndürülen sonraki şablon aynı türde olduğu sürece yenileme olarak sayılır ve şablon kotasına dahil edilmez.

Sesli rehberlik sağlama

Navigasyon rehberini araba hoparlörlerinden çalmak için uygulamanızın ses odağını istemesi gerekir. AudioFocusRequest kapsamında, kullanımı AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE olarak ayarlayın. Ayrıca, odak kazancını AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK olarak ayarlayın.

Gezinmeyi simüle etme

Uygulamanızı Google Play Store'a gönderirken uygulamanızın gezinme işlevini doğrulamak için NavigationManagerCallback.onAutoDriveEnabled geri çağırma işlevini uygulamanız gerekir. Bu geri çağırma işlevi çağrıldığında, uygulamanız kullanıcı gezinmeye başladığında seçilen hedefe gitmeyi simüle etmelidir. Uygulamanız, mevcut Session öğesinin yaşam döngüsü Lifecycle.Event.ON_DESTROY durumuna ulaştığında bu moddan çıkabilir.

onAutoDriveEnabled uygulamanızın çağrıldığını test etmek için komut satırından aşağıdakileri çalıştırabilirsiniz:

adb shell dumpsys activity service CAR_APP_SERVICE_NAME AUTO_DRIVE

Bu durum aşağıdaki örnekte gösterilmektedir:

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

Varsayılan navigasyon aracı uygulaması

Android Auto'da varsayılan navigasyon uygulaması, kullanıcının açtığı son navigasyon uygulamasına karşılık gelir. Kullanıcı Asistan üzerinden navigasyon komutları çağırdığında veya başka bir uygulama navigasyonu başlatmak için intent gönderdiğinde varsayılan uygulama navigasyon intent'lerini alır.

Bağlam içi gezinme uyarılarını görüntüleme

Alert, navigasyon ekranının bağlamından ayrılmadan sürücüye isteğe bağlı işlemlerle önemli bilgiler gösterir. Sürücünün en iyi deneyimi yaşamasını sağlamak için Alert, navigasyon rotasının engellenmesini önlemek ve sürücünün dikkatinin dağılmasını en aza indirmek amacıyla NavigationTemplate içinde çalışır.

Alert yalnızca NavigationTemplate içinde kullanılabilir. Kullanıcıyı NavigationTemplate dışında bilgilendirmek için Görüntüleme bildirimleri bölümünde açıklandığı gibi bir uyarı bildirimi (HUN) kullanabilirsiniz.

Örneğin, Alert'ü kullanarak:

  • Sürücüyü mevcut navigasyonla ilgili bir güncelleme (ör. trafik koşullarındaki bir değişiklik) hakkında bilgilendirme
  • Sürücünün mevcut navigasyonla ilgili güncelleme yapmasını isteyin (ör. hız tuzağı olup olmadığı).
  • Sürücünün kabul edip etmediğini sorarak sürücüye yaklaşan bir görevi teklif edin (ör. sürücünün yolda birini alıp almayacağını sorun).

Temel biçiminde bir Alert, bir başlık ve Alert süreden oluşur. Süre, bir ilerleme çubuğuyla gösterilir. İsteğe bağlı olarak altyazı, simge ve en fazla iki Action nesnesi ekleyebilirsiniz.

Şekil 2. Bağlam içi gezinme uyarısı.

Sürücü etkileşimi NavigationTemplate'ten ayrılmayla sonuçlanırsa gösterilen Alert başka bir şablona aktarılmaz. Alert zaman aşımına uğrayana, kullanıcı bir işlem yapana veya uygulama Alert'ı kapatana kadar orijinal NavigationTemplate'te kalır.

Uyarı oluşturma

Alert örneği oluşturmak için Alert.Builder'u kullanın:

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İptal veya reddi dinlemek istiyorsanız AlertCallback arayüzünün bir uygulamasını oluşturun. AlertCallback arama yolları şunlardır:

Uyarı süresini yapılandırma

Uygulamanızın ihtiyaçlarına uygun bir Alert süresi seçin. Gezinme Alert için önerilen süre 10 saniyedir. Daha fazla bilgi için Navigasyon uyarıları bölümüne göz atın.

Uyarı gösterme

Alert göstermek için uygulamanızın CarContext üzerinden kullanılabilen AppManager.showAlert yöntemini çağırın.

// Show an alert
carContext.getCarService(AppManager.class).showAlert(alert)
  • Şu anda görüntülenen Alert'nin kimliğiyle aynı alertId değerine sahip bir Alert ile showAlert çağrısı yapıldığında hiçbir işlem yapılmaz. Alert güncellenmez. Bir Alert'ü güncellemek için yeni bir alertId ile yeniden oluşturmanız gerekir.
  • showAlert'ü, şu anda gösterilen Alert'den farklı bir alertId içeren bir Alert ile çağırmak, şu anda gösterilen Alert'yi kapatır.

Uyarıları kapatma

Alert, zaman aşımı veya sürücü etkileşimi nedeniyle otomatik olarak kapatılır. Ancak Alert'ı manuel olarak da kapatabilirsiniz (ör. bilgileri güncel olmadığında). Bir Alert'yi kapatmak için Alert'nin alertId ile dismissAlert yöntemini çağırın.

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

Mevcut Alert ile eşleşmeyen bir alertId ile dismissAlert'ü çağırmak hiçbir şey yapmaz. İstisna atmaz.