Araç Kümesi API'sı

Navigasyon uygulamalarını görüntülemek için Instrument Cluster API'sini (bir Android API'si) kullanın. Örneğin, arabadaki ikincil bir ekranda (örneğin, gösterge panelindeki direksiyon. Bu sayfada, Arkadaş Bitkiler projesinin ve hizmeti Google Analytics 4 ile entegre etmek için Navigasyon uygulamalarının gösterebilmesi için CarService kullanıcı arayüzü.

Terminoloji

Bu sayfada aşağıdaki terimler kullanılır.

Araç EnstrümanıKüme Yöneticisi
Harici uygulamaların şurada etkinlik başlatmasını sağlayan bir CarManager örneği: gösterilir ve Gösterge Tablosu görüntülenmeye hazır olduğunda geri çağırmalar alırsınız. yardımcı olur.
Araç Yöneticisi
Harici uygulamalar tarafından arabaya özgü öğelerle etkileşim kurmak için kullanılan tüm yöneticilerin temel sınıfı CarService tarafından uygulanan hizmetler.
CarService
Harici uygulamalar arasında iletişim sağlayan Android Platform hizmeti (Google Haritalar dahil) ve Gösterge Grubu erişimi gibi arabaya özgü özellikler.
Hedef
Aracın gideceği son hedef.
Tahmini varış saati (TVS)
Bir hedefe varacağınız tahmini varış zamanı.
Ana birim (HU)
Arabaya yerleştirilmiş birincil işlem birimi. HU, tüm Android kodunu çalıştırır ve arabanın orta kısmına bağlanır.
Gösterge Grubu
Direksiyonun arkasında ve arabanın arasında bulunan ikincil ekran enstrümanlar. Bu, Google Cloud Platform'a bağlı bağımsız bir hesaplama birimi Aracın dahili ağı (CAN veri yolu) veya ikincil ekran üzerinden HU HU'ya bağlıdır.
Gösterge Kümesi Oluşturma Hizmeti
Araç Kümesi ile arayüz oluşturmak için kullanılan hizmete ait temel sınıfı görüntüleyin. OEM'ler, donanım da satın alabilirsiniz.
KitchenSink uygulaması
Test uygulaması Android Automotive'e dahildir.
Rota
Aracın bir hedefe varmak için izlediği yol.
Singleton hizmeti
android:singleUser özelliğine sahip bir Android hizmeti. Kuyruklu a işareti herhangi bir zamanda, hizmetin en çok bir örneği Android sisteminde çalışır.

Ön koşullar

Devam etmeden önce aşağıdaki unsurları mutlaka edinin:

  • Android geliştirme ortamı. Android'i kurmak için için bkz. Oluşturma gereksinimleri.
  • Android kaynak kodunu indirin. Şu uygulamanın en son sürümünü edinin: Pi-car sürüm dalından (veya daha sonraki bir daldan) Android kaynak kodunu https://android.googlesource.com
  • Ana birim (HU). Çalışabilen bir Android cihaz Android 9 (veya sonraki sürümler). Bu cihazın kendi ekranının olması ve şunları yapabilmesi gerekir: Android'in yeni sürümleriyle ekran yanıp sönüyor.
  • Araç Kümesi aşağıdakilerden biridir:
    • HU'ya takılı fiziksel ikincil ekran. Öğe cihaz donanımı ve çekirdeği birden çok ekranın yönetilmesini destekler.
    • Bağımsız birim. Video akışı alıp gösterebilen ağ bağlantısı üzerinden HU kendi ekranında görebilirsiniz.
    • Emüle edilmiş ekran. Geliştirme sırasında şu emülasyonlu ortamları kullanın:
      • İkincil ekranlar simülasyonu. Simüle edilmiş bir AOSP Android dağıtımında ikincil ekran kullanmak için Geliştirici Seçenekleri'ne gidin Ayarlar sistem uygulamasındaki ayarlarda ve ardından İkincili simüle et'i seçin. görüntülenir. Bu yapılandırma, fiziksel bir ikincil üst üste bindirilmesi kaydıyla, bu görüntülü reklam, görüntüleyin.
      • Emüle edilmiş gösterge grubu. Android emülatörü dahil Gösterge tablosunu AAOS ile görüntüleme, ClusterRenderingService.

Entegrasyon mimarisi

Entegrasyon bileşenleri

Instrument Cluster API'nin tüm entegrasyonu şu üç bileşenden oluşur:

  • CarService
  • Navigasyon uygulamaları
  • OEM Gösterge Grubu Hizmeti

Entegrasyon bileşenleri

CarService

CarService, navigasyon uygulamaları ile araba arasında uyumlulaştırma yaparak yalnızca her zaman etkin olan bir navigasyon uygulaması varsa ve yalnızca android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL izni veri gönderebilir arabaya giderim.

CarService, arabaya özel tüm hizmetleri önyükler ve aşağıdakilere erişim sağlar: bir dizi yöneticiyle bu hizmetleri sürdürüyor. Hizmetlerle etkileşimde bulunmak için arabada çalışan uygulamalar bu yöneticilere erişebilir.

Gösterge grubu uygulaması için otomotiv OEM'lerinin özel bir en son sürümü güncelleyin ve ClusterRenderingService.

Bir Gösterge Kümesi oluştururken, başlatma işlemi sırasında CarService şunun InstrumentClusterRendererService anahtarını okur: Küme Oluşturma Hizmeti bir InstrumentClusterService uygulamasını bulun. AOSP'de bu giriş Navigation State API örnek kümesi uygulama oluşturma hizmetine işaret eder:

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

Bu girişte atıfta bulunulan hizmet başlatıldı ve şuna bağlı: CarService Google Haritalar gibi navigasyon uygulamaları, CarInstrumentClusterManager, CarService şuna sahip bir yönetici sağlar: Gösterge Grubu durumunu bağlı InstrumentClusterRenderingService düzeyinden günceller. (Bu örnekte, bound (bağlı) değer, Android Hizmetler.)

Gösterge Grubu hizmeti

OEM'ler, şu alt sınıfı içeren bir Android Paketi (APK) oluşturmalıdır: ClusterRenderingService.

Bu sınıfın iki amacı vardır:

  • Bir Android arayüzü ve Araç Kümesi oluşturma cihazı sağlar (bu sayfanın amacı).
  • Adım adım navigasyon durumu güncellemelerini alır ve oluşturur tavsiye edilir.

İlk amaçla, InstrumentClusterRendererService OEM uygulamaları araba kabinindeki ekranlarda bilgi oluşturmak için kullanılan ikincil ekranı başlatmalı ve bu bilgiyi CarService InstrumentClusterRendererService.setClusterActivityOptions() ve InstrumentClusterRendererService.setClusterActivityState() yöntem.

İkinci işlev için Gösterge Kümesi hizmeti, uygulanması Küme Oluşturma Hizmeti gezinme durumu güncelleme etkinliklerini alan ve Bir pakette kodlanmış eventType ve etkinlik verileri.

Entegrasyon sırası

Aşağıdaki şemada, gezinme durumunun uygulanması gösterilmektedir sağlayan otomatik bir kod snippet'idir:

Entegrasyon sırası

Bu görselde renkler şunları ifade eder:

  • Sarı. CarService CarNavigationStatusManager Android platformu tarafından sağlanır. Daha fazla bilgi edinmek için bkz. Araba ve CAR_NAVIGATION_SERVICE
  • Camgöbeği. InstrumentClusterRendererService uygulandı satın alabilirsiniz.
  • Mor. Google ve üçüncü taraf tarafından uygulanan Navigasyon uygulaması birlikte çalışır.
  • Yeşil. CarAppFocusManager. Daha fazla bilgi edinmek için bkz. CarAppFocusManager API'yi kullanma ve CarAppFocusManager.

Navigasyon Durumu bilgi akışı şu sırayı izler:

  1. CarService, InstrumentClusterRenderingService uygulamasını başlatır.
  2. InstrumentClusterRenderingService, başlatma sırasında güncellenir. Şu özelliklere sahip CarService:
    1. Belirsiz sınırlar gibi Gösterge Grubu görüntüleme özellikleri (belirsiz sınırlar hakkında daha fazla ayrıntıyı daha sonra görebilirsiniz).
    2. Gösterge Grubu ekranındaki etkinlikleri başlatmak için gereken etkinlik seçenekleri. Daha fazla bilgi edinmek için bkz. ActivityOptions (Etkinlik Seçenekleri).
  3. Bir navigasyon uygulaması (ör. Android Automotive için Google Haritalar veya herhangi bir harita uygulaması) gerekir):
    1. Car-lib'den Araba sınıfını kullanarak bir CarAppFocusManager elde eder.
    2. Adım adım yol tarifi başlamadan önce, Pas için CarAppFocusManager.requestFocus() appType rolünde CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION parametresinden sonra bir değer girin.
  4. CarAppFocusManager, bu isteği CarService adlı kullanıcıya iletir. İzin verilirse CarService, gezinme uygulaması paketini inceler ve bir etkinlik android.car.cluster.NAVIGATION kategorisi ile işaretlendi.
  5. Bu bulunursa, gezinme uygulaması tarafından bildirilen ActivityOptions InstrumentClusterRenderingService ve şunları içerir: Gösterge Kümesi görüntüleme özellikleri, amaçtaki ek öğeler olarak gösterilir.

API'yi entegre etme

InstrumentClusterRenderingService uygulaması:

  • Aşağıdaki değeri AndroidManifest.xml dosyasını deneyin. Bu, dokümanın tek bir kopyasının Gösterge Kümesi hizmeti, başlatma ve kullanıcı değiştirme sırasında bile çalışır:
    android:singleUser="true"
  • BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE sistem iznini basılı tutun. Bu yalnızca Araç Kümesi oluşturma hizmetinin dahil olduğunu Android sistem görüntüsünün CarService ile kısıtlanması:
    <uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
    

Gösterge Küme Oluşturma Hizmeti'ni Uygulama

Hizmeti derlemek için:

  1. Şundan başlayan bir sınıf yaz: Küme Oluşturma Hizmeti ve ardından AndroidManifest.xml dosyanıza karşılık gelen bir girişi ekleyin. Bu sınıf Araç Kümesi ekranını kontrol eder ve (isteğe bağlı olarak) Gezinme Durumu'nu oluşturabilir API verileri.
  2. onCreate() sırasında donanımını kullanıyor. Seçenekler aşağıdakileri içerir:
    • Gösterge Kümesi için kullanılacak ikincil ekranı belirleyin.
    • Gösterge Tablosu uygulamasının verileri oluşturup iletmesi için sanal bir ekran oluşturulan resmi harici birime dönüştürme (H.264 gibi bir video akışı biçimi kullanılarak).
  3. Yukarıda belirtilen ekran hazır olduğunda bu hizmet Tanımlamak için InstrumentClusterRenderingService#setClusterActivityLaunchOptions() bir Etkinliği görüntülemek için kullanılması gereken ActivityOptions Gösterge Tablosu. Şu parametreleri kullanın:
    • category.. ClusterRenderingService.
    • ActivityOptions. Şunları yapabilecek bir ActivityOptions örneği: bir Etkinliği başlatmak için kullanılır. Örneğin, AOSP'de Araç Kümesi uygulaması:
      getService().setClusterActivityLaunchOptions(
        CATEGORY_NAVIGATION,
        ActivityOptions.makeBasic()
            .setLaunchDisplayId(displayId));
  4. Gösterge Kümesi, etkinlikleri görüntülemeye hazır olduğunda bu hizmet, InstrumentClusterRenderingService#setClusterActivityState() Bunları kullan parametre:
    • category. ClusterRenderingService.
    • state paketi şununla oluşturuldu: ClusterRenderingService. Şu verileri sağladığınızdan emin olun:
      • visible Gösterge Tablosunu görünür ve kullanıma hazır olarak belirtir Görüntülü Reklam Ağı'nda yayınlanacak.
      • unobscuredBounds İçerik görüntülemenin güvenli olduğu Gösterge Grubu ekranı. Örneğin, kadranlar ve göstergelerle kaplıdır.
  5. Service#dump() yöntemini geçersiz kılın ve aşağıdakiler için yararlı olan rapor durum bilgilerini sağlayın: hata ayıklama (bkz. dumpsys) bakın).

Örnek InstrumentClusterRenderingService uygulaması

Aşağıdaki örnekte bir InstrumentClusterRenderingService özetlenmiştir Araç'ı sunmak için VirtualDisplay oluşturur. İçerikleri uzaktaki bir fiziksel ekranda gruplayın.

Alternatif olarak bu kod, fiziksel bir ikincil hesabın displayId kodunu iletebilir olduğu biliniyorsa, HU'ye bağlı bir ekran.

/**
* Sample {@link InstrumentClusterRenderingService} implementation
*/
public class SampleClusterServiceImpl extends InstrumentClusterRenderingService {
   // Used to retrieve or create displays
   private final DisplayManager mDisplayManager;
   // Unique identifier for the display to 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'yi kullanma

CarAppFocusManager API, getAppTypeOwner() adlı bir yöntem sağlar. Bu yöntem, belirli bir noktada hangi navigasyon uygulamasının navigasyon odağına sahip olduğunu bilmek için OEM'ler tarafından yazılan küme hizmeti gerekir. OEM'ler mevcut CarAppFocusManager#addFocusListener() yöntemini kullanabilir ve ardından hangi uygulamaya odaklanıldığını öğrenmek için getAppTypeOwner() uygulamasını kullanın. Bu bilgiler sayesinde OEM'ler:

  • Kümede gösterilen etkinliği, gezinme uygulaması tarafından sağlanan küme etkinliğine geçirin. odaklanmayı deneyebilirsiniz.
  • Odaklanılan gezinme uygulamasının küme etkinliği olup olmadığını algılayabilir. Odaklanılan Bir küme etkinliği yoksa (veya bu tür bir etkinlik devre dışı bırakılmışsa) OEM'ler Bu sinyali araç DIM'sine göndererek kümenin gezinme özelliğinin tamamen atlanmasını sağlayın.

Geçerli uygulama odağını ayarlamak ve dinlemek için CarAppFocusManager tuşunu kullanın. Örneğin: veya sesli komut kullanabilirsiniz. Genellikle bu tür bir uygulamanın yalnızca bir örneği etkin olarak (ya da odaklanmış durumdayken) dikkat edin.

Uygulama odağını dinlemek için CarAppFocusManager#addFocusListener(..) yöntemini kullanın değişiklikler:

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
}

Paketi almak için CarAppFocusManager#getAppTypeOwner(..) yöntemini kullanın belirli bir uygulama türünün mevcut sahibinin adları. Bu yöntem Geçerli sahip android:sharedUserId özelliğini kullanıyorsa birden fazla paket adı.

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

...

Ek: Örnek uygulamayı kullanma

AOSP, Navigation State API'yi uygulayan örnek bir uygulama sağlar.

Bu örnek uygulamayı çalıştırmak için:

  1. Android Auto'yu desteklenen bir HU üzerinde derleyip yükleyin. Şunu kullanın: Cihazınıza özel Android oluşturma ve yanıp sönme talimatları. Talimatlar için bkz. Referans Panellerini Kullanma.
  2. HU'ya fiziksel bir ikincil ekran bağlayın (destekleniyorsa) veya sanal ikincil HU:
    1. Ayarlar uygulamasında Geliştirici Modu'nu seçin.
    2. Ayarlar > Sistem > Gelişmiş > Geliştirici seçenekleri > İkincil ekranları simüle edin.
  3. HU'yu yeniden başlatma
  4. KitchenSink uygulamasını başlatmak için:
    1. Çekmeceyi açın.
    2. Inst. Küme.
    3. META VERİLERİ BAŞLAT'ı tıklayın.

KitchenSink, GEZİNME odağı istiyor ve bu işlem DirectRenderingCluster talimatını veriyor. hizmetini kullanabilirsiniz.