Navigasyon uygulaması oluşturma

Bu sayfada, adım adım navigasyon uygulamanızın işlevlerini uygulamak için kullanabileceğiniz Araba Uygulaması Kitaplığı'nın farklı özellikleri açıklanmaktadır.

Manifest'inizde gezinme desteğini beyan edin

Navigasyon uygulamanızın, CarAppService intent filtresinde androidx.car.app.category.NAVIGATION araba uygulaması kategorisini beyan etmesi gerekiyor:

<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 amaçlarına yönelik destek

Uygulamanızın, sesli sorgu kullanarak Google Asistan'dan gelenler de dahil olmak üzere navigasyon niyetini desteklemek için Session.onCreateScreen ve Session.onNewIntent içinde CarContext.ACTION_NAVIGATE amacını işlemesi gerekir.

Niyetin biçimiyle ilgili ayrıntılar için CarContext.startCarApp ile ilgili dokümanlara bakın.

Gezinme şablonlarına erişme

Navigasyon uygulamaları, arka planda bir yüzeyi haritayla birlikte görüntüleyen ve etkin navigasyon sırasında adım adım yol tarifi gösteren aşağıdaki şablonlara erişebilir.

  • NavigationTemplate: Aktif navigasyon sırasında isteğe bağlı bir bilgi mesajı ve seyahat tahminleri de gösterir.
  • MapWithContentTemplate: Uygulamanın, bir tür içeriğe sahip harita bloklarını (örneğin, liste) oluşturmasına olanak tanıyan bir şablon. İçerik genellikle harita desenlerinin üzerinde bir bindirme olarak oluşturulur ve harita görünür ve sabit alanlar içeriğe göre ayarlanır.

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

Gezinme ş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 bir izin gerekiyor.

MapWithContentTemplate'e taşıma

Car App API Düzey 7'den itibaren MapTemplate, PlaceListNavigationTemplate ve RoutePreviewNavigationTemplate kullanımdan kaldırılmıştır. Desteği sonlandırılan şablonlar desteklenmeye devam edecektir, ancak MapWithContentTemplate'a taşınması önemle tavsiye edilir.

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

HaritaŞablonu

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

Yer Listesi Gezinme Şablonu

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

RotaÖnizlemeGezinmeŞablonu

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ı, ek navigasyon meta verilerini ana makineye iletmelidir. Ana makine, bu bilgileri araç ana birimine bilgi sağlamak ve navigasyon uygulamalarının paylaşılan kaynaklar üzerinde çakışmasını önlemek için kullanır.

Navigasyon 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 mevcut navigasyon durumundan haberdar olması gerekir. Kullanıcı navigasyonu başlattığında NavigationManager.navigationStarted numaralı telefonu arayın. Benzer şekilde, gezinme sona erdiğinde (örneğin, kullanıcı hedefine ulaştığında veya navigasyonu iptal ettiğinde) NavigationManager.navigationEnded çağrısı yapın.

NavigationManager.navigationEnded öğesini yalnızca kullanıcı gezinmeyi bitirdiğinde çağırın. Örneğin, bir yolculuğun ortasında rotayı yeniden hesaplamanız gerekiyorsa bunun yerine Trip.Builder.setLoading(true) değerini kullanın.

Bazen ana makine, gezinmeyi durdurmak için bir uygulamaya ihtiyaç duyar ve uygulamanızın NavigationManager.setNavigationManagerCallback aracılığıyla sağladığı bir NavigationManagerCallback nesnesinde onStopNavigation komutunu çağırır. Uygulama daha sonra küme ekranında, navigasyon bildirimlerinde ve sesli yardımda sonraki dönüş bilgilerini yayınlamayı durdurmalıdır.

Gezi bilgilerini güncelleyin

Etkin navigasyon sırasında NavigationManager.updateTrip numaralı telefonu arayın. Bu görüşmede sağlanan bilgiler, aracın seti ve uyarı ekranları tarafından kullanılabilir. Sürüşteki araca bağlı olarak, tüm bilgiler kullanıcıya gösterilmez. Örneğin, Masaüstü Ana Birimi (DHU) Trip öğesine eklenen Step değerini gösterir ancak Destination bilgilerini göstermez.

Küme Ekranına Çizim

En kapsamlı kullanıcı deneyimini sunmak için aracın küme ekranında temel meta verileri göstermenin ötesine geçebilirsiniz. Car App API Düzey 6'dan itibaren navigasyon uygulamaları, aşağıdaki sınırlamalarla kendi içeriklerini doğrudan küme ekranında (desteklenen araçlarda) oluşturma seçeneğine sahiptir:

  • Küme görüntüleme API'si giriş kontrollerini desteklemiyor
  • Küme görüntüsü yalnızca harita parçalarını göstermelidir. İsteğe bağlı olarak bu karolarda aktif rota navigasyonu görüntülenebilir.
  • Küme görüntüleme API'si yalnızca NavigationTemplate kullanımını destekler
    • Ana ekranların aksine küme ekranları tüm NavigationTemplate kullanıcı arayüzü öğelerini (ör. adım adım talimatlar, TVS kartları ve işlemler) tutarlı bir şekilde göstermeyebilir. Harita parçaları, tutarlı şekilde görüntülenen tek kullanıcı arayüzü öğesidir.

Küme Desteğini Bildirme

Ana makine uygulamaya, uygulamanızın küme ekranlarında oluşturmayı desteklediğini bildirmek için aşağıdaki snippet'te gösterildiği gibi CarAppService cihazınızın <intent-filter> öğesine 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 araba 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 şablon grubu) sağlayan SessionInfo türünde 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 bir ekrandaki davranışı özelleştirmek için görüntülü reklama özgü Sessions oluşturma (aşağıdaki snippet'te gösterildiği gibi) seçeneğine sahiptir.

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 görüntüsünün ne zaman veya sağlanacağı ile ilgili herhangi bir garanti verilmez. Ayrıca, Session kümesinin tek Session olması da mümkündür (örneğin, kullanıcı, uygulamanız aktif olarak gezinirken ana ekranı başka bir uygulamayla değiştirmiştir). "Standart" anlaşmaya göre uygulama, küme görüntüleme kontrolünü yalnızca NavigationManager::navigationStarted çağrıldıktan sonra ele alır. Bununla birlikte, uygulamanın etkin bir gezinme yokken küme görünümünün sağlanması veya küme ekranının hiçbir zaman sağlanmaması mümkündür. Uygulamanızın harita bloklarının boşta kalma durumunu oluşturarak bu senaryoları yönetmek uygulamanıza bağlıdır.

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

Küme Desteğini Test Etme

Uygulamanızı hem Android Auto hem de Android Automotive OS'te test edebilirsiniz. Android Auto'da bu işlem ikincil küme görüntüsü emüle etmek için Masaüstü Ana Birimini yapılandırarak yapılır. Android Automotive OS'te API düzeyi 30 ve üstü için genel sistem görüntüleri, küme görüntüsü emülasyonu kullanır.

Seyahat tahminini metin veya simge ile özelleştirin

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, tahmini varış saati, kalan süre ve kalan mesafenin yanında veya yerine isteğe bağlı olarak metin ve simgeleri ayarlamak için TravelEstimate özelliğini kullanır.

Şekil 1. Özel simge ve metin ile seyahat tahmini.

Aşağıdaki snippet, seyahat tahminini özelleştirmek için setTripIcon ve setTripText özelliklerini kullanı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 bildirimler sağlama

Sık güncellenen bir navigasyon bildirimi kullanarak adım adım (TBT) navigasyon talimatları sağlayın. Araç ekranında navigasyon bildirimi olarak işlenmesi için bildirim oluşturucunuzun aşağıdakileri yapması gerekir:

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

Araç ekranının altındaki ray widget'ında bir navigasyon bildirimi görüntülenir. Bildirimin önem düzeyi IMPORTANCE_HIGH olarak ayarlanırsa uyarı bildirimi (HUN) olarak da gösterilir. Önem, CarAppExtender.Builder.setImportance yöntemiyle ayarlanmazsa bildirim kanalının önemi kullanılır.

Uygulama, kullanıcı HUN veya demir yolu widget'ına dokunduğunda uygulamaya gönderilen CarAppExtender içinde bir PendingIntent ayarlayabilir.

NotificationCompat.Builder.setOnlyAlertOnce, true değeriyle çağrılırsa yüksek önem düzeyine sahip bildirim yalnızca HUN'da 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 bildirim, tren widget'ını güncelleyip bildirimi yalnızca HUN olarak gösterir. HUN davranışını, CarAppExtender.Builder.setImportance ile bildirimin önem derecesini ayarlayarak kontrol edebilirsiniz. Önem değeri IMPORTANCE_HIGH olarak ayarlandığında HUN gösterilir. Bunu başka bir değere ayarlamak yalnızca tren widget'ını günceller.

PlaceList NavigationTemplate içeriğini yenile

Sürücülerin PlaceListNavigationTemplate ile oluşturulan yerlerin listelerine göz atarken tek bir dokunuşla içeriği yenilemelerini sağlayabilirsiniz. Liste yenilemeyi etkinleştirmek için OnContentRefreshListener arayüzünün onContentRefreshRequested yöntemini uygulayın ve işleyiciyi şablonda ayarlamak üzere PlaceListNavigationTemplate.Builder.setOnContentRefreshListener kullanın.

Aşağıdaki snippet'te, şablonda işleyicinin 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 işleyicinin bir değeri varsa PlaceListNavigationTemplate öğesinin başlığında gösterilir.

Kullanıcı yenile düğmesini tıkladığında OnContentRefreshListener uygulamanızın onContentRefreshRequested yöntemi çağrılır. onContentRefreshRequested içinde Screen.invalidate yöntemini çağırın. Daha sonra ana makine, yenilenmiş içerikle şablonu almak için uygulamanızın Screen.onGetTemplate yöntemini tekrar çağırır. Şablonları yenileme hakkında daha fazla bilgi için Şablonun içeriğini yenileme bölümüne bakın. onGetTemplate tarafından döndürülen bir sonraki şablon aynı türde olduğu sürece bu yenilenme olarak sayılır ve şablon kotasına dahil edilmez.

Sesli yardım sağlayın

Navigasyon yardımını araç hoparlörü üzerinden oynatmak için uygulamanızın ses odağı isteğinde bulunması 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 et

Uygulamanızı Google Play Store'a gönderdiğinizde gezinme işlevini doğrulamak için uygulamanızın NavigationManagerCallback.onAutoDriveEnabled geri çağırmasını uygulaması gerekir. Bu geri çağırma çağrıldığında, kullanıcı navigasyonu başlattığında uygulamanızın seçilen hedefe giden yolu simüle etmesi gerekir. Mevcut Session yaşam döngüsünün Lifecycle.Event.ON_DESTROY durumuna ulaştığında uygulamanız bu moddan çıkabilir.

Bir komut satırından aşağıdaki komutu çalıştırarak onAutoDriveEnabled uygulamanızın çağrılıp çağrılmadığını test edebilirsiniz:

adb shell dumpsys activity service CAR_APP_SERVICE_NAME AUTO_DRIVE

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

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

Varsayılan navigasyon araç uygulaması

Android Auto'da, varsayılan navigasyon araç uygulaması, kullanıcının başlattığı son navigasyon uygulamasına karşılık gelir. Kullanıcı, Asistan aracılığıyla navigasyon komutlarını çağırdığında veya başka bir uygulama navigasyonu başlatma niyeti gönderdiğinde, varsayılan uygulama gezinme amaçları alır.

Bağlam içi gezinme uyarılarını göster

Alert, gezinme ekranının bağlamından ayrılmadan isteğe bağlı işlemlerle sürücüye önemli bilgileri gösterir. Sürücüye en iyi deneyimi sunmak amacıyla Alert, navigasyon rotasını engellememek ve sürücünün dikkatini en aza indirmek için NavigationTemplate içinde çalışır.

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

Örneğin, Alert kullanarak şunları yapabilirsiniz:

  • Mevcut navigasyonla ilgili bir güncelleme (ör. trafik koşullarındaki bir değişiklik) hakkında sürücüye bilgi verin.
  • Sürücüden mevcut navigasyonla ilgili bir güncelleme (ör. hız tuzağı olması) isteyin.
  • Yaklaşan bir görev önerin ve sürücünün bunu kabul edip etmediğini (örneğin, sürücünün yolda birini almak isteyip istemediğini) sorun.

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

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

Alert gösterildikten sonra, sürücü etkileşiminin NavigationTemplate etiketinden ayrılmasıyla sonuçlanıyorsa öğe başka bir şablona aktarılmaz. Alert zaman aşımına uğrayana, kullanıcı bir işlem yapana veya uygulama Alert öğesini kapatana kadar orijinal NavigationTemplate içinde kalır.

Uyarı oluştur

Alert örneği oluşturmak için Alert.Builder aracını 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 iptali veya kapatma işlemini dinlemek istiyorsanız AlertCallback arayüzünün bir uygulamasını oluşturun. AlertCallback arama yolları şunlardır:

Uyarı süresini yapılandır

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 bakın.

Uyarı göster

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

// Show an alert
carContext.getCarService(AppManager.class).showAlert(alert)
  • Şu anda teşhirde olan Alert cihazının kimliğiyle aynı olan alertId bir Alert ile showAlert çağrısı yapıldığında herhangi bir şey olmaz. Alert güncellenmiyor. Bir Alert öğesini güncellemek için yeni bir alertId ile yeniden oluşturmanız gerekir.
  • showAlert çağrısı, şu anda ekranda gösterilen Alert öğesinden farklı alertId olan bir Alert ile çağrıldığında, görüntülenmekte olan Alert kapatılır.

Uyarıyı kapatma

Bir Alert, zaman aşımı veya sürücü etkileşimi nedeniyle otomatik olarak kapansa da Alert öğesini (örneğin, bilgilerin güncel olmaması gibi) manuel olarak da kapatabilirsiniz. Bir Alert öğesini kapatmak için Alert öğesinin alertId ile dismissAlert yöntemini çağırın.

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

Şu anda görüntülenen Alert ile eşleşmeyen bir alertId üzerinden dismissAlert çağrısının yapılması herhangi bir şey sağlamaz. Bu durum bir istisna değildir.