Alet Kümesi

Google Haritalar da dahil olmak üzere navigasyon uygulamalarını bir arabada, örneğin gösterge panelindeki direksiyon simidi arkasında ikincil bir ekranda görüntülemek için Instrument Cluster API'sini (bir Android API'si) kullanın. Bu sayfa ikincil ekranı kontrol etmek için bir hizmet oluşturmak ve daha sonra birlikte hizmet entegre etmek açıklamaktadır CarService o navigasyon uygulamaları, bir kullanıcı arayüzünü göstermesi için.

terminoloji

Bu sayfada aşağıdaki terimler kullanılmaktadır:

Terim Açıklama
CarInstrumentClusterManager Bir CarManager harici uygulamalar sağlayan Enstrüman kümede bir etkinlik başlatmak ve Kombine faaliyetlerini görüntülemek için hazır olduğunda geri aramalar almayı.
Araba Yöneticisi Tarafından uygulanan oto-özel hizmetler ile etkileşim için harici uygulamalar tarafından kullanılan tüm yöneticilerin Taban sınıfı CarService .
CarService Harici uygulamalar (Google Haritalar dahil) ile Araç Kümesi erişimi gibi araca özgü özellikler arasında iletişim sağlayan Android Platform hizmeti.
Hedef Aracın gideceği son varış noktası.
tahmini varış süresi Varış noktasına tahmini varış zamanı.
Ana ünite (HU) Bir arabaya gömülü birincil hesaplama birimi. HU, tüm Android kodunu çalıştırır ve arabadaki merkezi ekrana bağlanır.
Alet Kümesi Direksiyon simidinin arkasında ve araç göstergeleri arasında bulunan ikincil ekran. Bu, aracın dahili ağı (CAN veriyolu) aracılığıyla HU'ya bağlı bağımsız bir hesaplama birimi veya HU'ya bağlı ikincil bir ekran olabilir.
InstrumentClusterRenderingService Alet Kümesi ekranıyla arabirim oluşturmak için kullanılan hizmet için temel sınıf. OEM'ler, OEM'e özgü donanımla etkileşime giren bu sınıfın bir uzantısını sağlamalıdır.
KitchenSink uygulaması Android Automotive'de bulunan test uygulaması.
Güzergah Bir aracın bir hedefe varmak için gittiği belirli bir yol.
Tekton hizmeti İle bir Android hizmet android:singleUser özniteliği. Herhangi bir zamanda, hizmetin en fazla bir örneği Android sisteminde çalışır.

Önkoşullar

Entegrasyonu geliştirmek için şu unsurlara sahip olduğunuzdan emin olun:

  • Android geliştirme ortamı. Android geliştirme ortamı kurmak için, bkz Yapı gereksinimleri .
  • Android kaynak kodunu indirin. En (veya üstü) pi-car-salım daldan Android kaynak kodunun en son sürümünü edinin https://android.googlesource.com .
  • Ana Ünite (HU). Android 9 (veya üstü) çalıştırabilen bir Android cihazı. Bu cihazın kendi ekranı olmalı ve yeni Android yapıları ile ekranı yanıp sönme yeteneğine sahip olmalıdır.
  • Kombine Gösterge aşağıdakilerden biridir:
    • HU'ya bağlı fiziksel ikincil ekran. Aygıt donanımı ve çekirdeği birden çok ekranın yönetimini destekliyorsa.
    • Bağımsız birim. Bir ağ bağlantısı aracılığıyla HU'ya bağlanan, kendi ekranında bir video akışını alabilen ve görüntüleyebilen herhangi bir hesaplama birimi.
    • Öykünülmüş ekran. Geliştirme sırasında, şu öykünülmüş ortamlardan birini kullanabilirsiniz:
      • Simüle edilmiş ikincil ekranlar. Herhangi bir AOSP Android dağıtımında simüle edilmiş bir ikincil ekranı etkinleştirmek için, Ayarlar sistem uygulamasındaki Geliştirici Seçenekleri ayarlarına gidin ve ardından İkincil ekranları simüle et'i seçin. Bu yapılandırma, bu ekranın birincil ekranın üzerine bindirilmesi sınırlamasıyla birlikte, fiziksel bir ikincil ekran eklemeye eşdeğerdir.
      • Öykünülmüş gösterge paneli. Android Otomotiv ile birlikte Android emülatörü ile bir gösterge paneli görüntülemek için bir seçenek sunar Android emülatörü _qemu-borular . Kullanım DirectRenderingCluster bu taklit harici bir ekrana bağlanmak için referans gösterge paneli uygulaması.

Entegrasyon mimarisi

Entegrasyon bileşenleri

Instrument Cluster API'nin herhangi bir entegrasyonu şu üç bileşenden oluşur:

  • CarService
  • Navigasyon uygulamaları
  • OEM Enstrüman Kümesi Hizmeti

Entegrasyon bileşenleri

Araba servisi

CarService tek navigasyon uygulaması herhangi bir zamanda etkin ve sadece sahip uygulamaların sağlanması navigasyon uygulamaları ile araç arasındaki aracılık yapar, android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL arabaya veri gönderebilir izni.

CarService tüm otomobillere özel servisleri bot ve yöneticileri bir dizi bu hizmetlere erişim sağlar. Servislerle etkileşim kurmak için arabada çalışan uygulamalar bu yöneticilere erişebilir.

Gösterge paneli uygulanması için, otomotiv OEM InstrumentClusterRendererService özel olarak uygulanması oluşturmalısınız ve güncellemek config.xml bu özelleştirilmiş uygulanmasına noktasına dosyayı.

Önyükleme işlemi sırasında bir Enstrüman Cluster, render yaparken CarService okur InstrumentClusterRendererService anahtarını config.xml bir uygulama bulmak için InstrumentClusterService . AOSP'de bu giriş, Gezinme Durumu API'si örnek küme uygulaması oluşturma hizmetine işaret eder:

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

Bu giriş atıfta hizmet başlatıldı ve bağlı CarService . Navigasyon uygulamalarına Google Maps gibi bir istekte CarInstrumentClusterManager , CarService bağlı den Gösterge Grubu durumunu günceller bir yönetici sağlamaktadır InstrumentClusterRenderingService . (Bu durumda, sınır belirtmektedir Android Services .)

Alet Kümesi Hizmeti

OEM bir alt sınıfı içeren bir Android Paketi'ni (APK) oluşturmanız gerekir InstrumentClusterRendererService . Bkz ClusterRenderingService bir örnek için.

Bu sınıf iki amaca hizmet eder:

  • Bir arayüz Android ve Instrument Cluster oluşturma cihazı sağlar (bu sayfanın amacı).
  • Adım adım navigasyon kılavuzu gibi navigasyon durumu güncellemelerini alır ve işler.

İlk amaçla, OEM uygulamaları InstrumentClusterRendererService araba kabinde ekranlarında bilgiyi işlemek için kullanılan ikincil ekran başlatması gerektiği ve bu bilgileri iletişim CarService için çağırarak InstrumentClusterRendererService.setClusterActivityOptions() ve InstrumentClusterRendererService.setClusterActivityState() yöntemleri.

İkinci işlev için, Enstrüman Küme hizmeti bir uygulamasını sağlamalıdır NavigationRenderer bir şekilde kodlanmıştır navigasyon durum güncellemesi olayları, aldığı arayüzüne eventType bir tomar halinde kodlanmış ve olay verilerinin.

Entegrasyon sırası

Aşağıdaki şema, güncellemeleri işleyen bir gezinme durumunun uygulanmasını göstermektedir:

Entegrasyon sırası

Bu çizimde renkler aşağıdakileri ifade eder:

  • Sarı. CarService ve CarNavigationStatusManager Android platformunun sağladığı.
  • camgöbeği. InstrumentClusterRendererService OEM tarafından uygulanan.
  • Mor. Google ve üçüncü taraf geliştiriciler tarafından uygulanan Navigasyon uygulaması.
  • Yeşil. CarAppFocusManager .

Navigasyon Durumu bilgi akışı şu sırayı takip eder:

  1. CarService başlatır InstrumentClusterRenderingService .
  2. Başlatma sırasında, InstrumentClusterRenderingService günceller CarService ile:
    1. Gösterge Kümesi, belirsiz sınırlar gibi özellikleri gösterir (belirsiz sınırlar hakkında daha fazla ayrıntıya daha sonra bakın).
    2. Kombine Gösterge ekranı içindeki fırlatma faaliyetleri için gerekli Etkinlik seçenekleri (en fazla ayrıntı görmek ActivityOptions .
  3. Bir navigasyon uygulaması (Android Automotive için Google Haritalar veya gerekli izinlere sahip herhangi bir harita uygulaması gibi):
    1. Edinir Bir CarAppFocusManager araba lib Araba sınıfını kullanarak.
    2. Adım adım dönüş yönleri başlamadan önce, çağrıları CarAppFocusManager.requestFocus() geçmek CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION olarak appType parametresi.
  4. CarAppFocusManager için bu isteği iletir CarService . Kabul edilirse, CarService navigasyon uygulaması paketini inceler ve kategori ile işaretlenmiş bir etkinliği bulur android.car.cluster.NAVIGATION .
  5. Bulduysanız, navigasyon uygulamasıdır kullanır ActivityOptions tarafından bildirilen InstrumentClusterRenderingService faaliyete geçebilmek için ve niyet de ekstra olarak Enstrüman Küme görüntü özelliklerini içerir.

API'yi entegre etme

InstrumentClusterRenderingService uygulama zorunluluk:

  • AndroidManifest.xml dosyasına aşağıdaki değeri ekleyerek tek bir hizmet olarak atanın. Bu, Başlatma ve kullanıcı değiştirme sırasında bile Alet Kümesi hizmetinin tek bir kopyasının çalışmasını sağlamak için gereklidir:
    android:singleUser="true"
  • Tut BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE sistemi izni. Sadece Android sistem görüntünün bir parçası olarak dahil Enstrüman Küme oluşturma hizmeti hiç bağlı olan bu garantiler CarService :
    <uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
    

InstrumentClusterRenderingService'i Uygulama

Hizmeti oluşturmak için:

  1. Uzanan bir sınıf yaz InstrumentClusterRenderingService ve sonra bir tekabül giriş eklemek AndroidManifest.xml dosyası. Bu sınıf Kombine Gösterge ekranı kontrol eden ve (isteğe bağlı) Navigasyon Devlet API verilerini oluşturabilir.
  2. Sırasında onCreate() , render donanımıyla iletişimi başlatmak için bu hizmeti kullanmak. Seçenekler şunları içerir:
    • Gösterge Grubu için kullanılacak ikincil ekranı belirleyin.
    • Instrument Cluster uygulamasının oluşturulan görüntüyü harici bir birime (H.264 gibi bir video akış formatı kullanarak) oluşturması ve iletmesi için sanal bir ekran oluşturun.
  3. Ekran yukarıda belirtilen hazır olduğunda, bu hizmet çağırmalıdır InstrumentClusterRenderingService#setClusterActivityLaunchOptions() tam tanımlamak için ActivityOptions Enstrüman Kümesi üzerinde Aktivite görüntülemek için kullanılmalıdır. Bu parametreleri kullanın:
    • kategori. CarInstrumentClusterManager#CATEGORY_NAVIGATION
    • ActivityOptions. Bir ActivityOptions Enstrüman Kümesi bir Aktivite başlatmak için kullanılabilir örneği. Örneğin, AOSP üzerinde numune Kombine uygulanmasından:
      getService().setClusterActivityLaunchOptions(
         CATEGORY_NAVIGATION,
         ActivityOptions.makeBasic()
            .setLaunchDisplayId(displayId));
      
  4. Gösterge Grubu faaliyetlerini görüntülemek için hazır olduğunda, bu hizmeti çağırmak zorundadır InstrumentClusterRenderingService#setClusterActivityState() . Bu parametreleri kullanın:
    • category CarInstrumentClusterManager#CATEGORY_NAVIGATION
    • state Paketi ile oluşturulan ClusterActivityState . Aşağıdaki verileri sağladığınızdan emin olun:
      • visible belirtir görünür ve ekran içeriği hazır olarak Gösterge Grubu.
      • unobscuredBounds o ekran içeriğine güvenli olduğu Gösterge Grubu görüntü içinde alanını tanımlayan bir dikdörtgen. Örneğin, kadranlar ve göstergeler tarafından kapsanan alanlar.
  5. Geçersiz Kıl Service#dump() hata ayıklama için yararlı bir yöntem ve rapor durumu bilgilerini (bkz dumpsys fazla bilgi için).

Örnek InstrumentClusterRenderingService uygulaması

Aşağıdaki örnek, bir ana hatlarıyla InstrumentClusterRenderingService bir oluşturur uygulanmasını VirtualDisplay uzak fiziksel ekranda Gösterge Grubu içeriği sunmak.

Seçenek olarak ise, bu kod geçebileceği displayId bir uygun olduğu biliniyorsa, HU bağlı fiziksel İkincil ekranın.

/**
* 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'ı Kullanma

CarAppFocusManager API adında bir yöntem sağlar getAppTypeOwner() herhangi bir zamanda navigasyon odağı olan navigasyon uygulaması bilmek OEM'lerden tarafından yazılan küme hizmetini verir. OEM mevcut kullanabilirsiniz CarAppFocusManager#addFocusListener() yöntemini ve ardından kullanmak getAppTypeOwner() odağı olan uygulama öğrenmek için. Bu bilgilerle OEM'ler şunları yapabilir:

  • Kümede gösterilen etkinliği, navigasyon uygulaması tutma odağı tarafından sağlanan küme etkinliğine geçirin.
  • Odaklanmış navigasyon uygulamasının bir küme etkinliği olup olmadığını algılayabilir. Odaklanmış navigasyon uygulamasının bir küme etkinliği yoksa (veya bu tür bir etkinlik devre dışı bırakılmışsa), OEM'ler bu sinyali araba DIM'ine gönderebilir, böylece kümenin navigasyon yönü tamamen atlanır.

Kullanım CarAppFocusManager ayarlamak ve bu tür aktif navigasyon veya ses komutu olarak, mevcut uygulama odaklı dinlemek için. Genellikle böyle bir uygulamanın yalnızca bir örneği sistemde aktif olarak çalışır (veya odaklanır).

Kullanım CarAppFocusManager#addFocusListener(..) uygulaması odak değişiklikleri işler için yöntem:

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
}

Kullanım CarAppFocusManager#getAppTypeOwner(..) odakta olan belirli bir uygulama türünün geçerli sahibinin paket isimlerini almak için yöntem. Geçerli sahip kullanıyorsa, bu yöntem birden fazla paket adı döndürebilir android:sharedUserId özelliğini.

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
}

...

Ek: Örnek uygulamayı kullanma

AOSP, Gezinme Durumu API'sini uygulayan örnek bir uygulama sağlar.

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

  1. Desteklenen bir HU'da Android Auto oluşturun ve flaşlayın. Cihazınıza özel Android oluşturma ve yanıp sönme talimatlarını kullanın. Talimatlar için bkz Referans Kurullarının Kullanılması .
  2. HU'ya (destekleniyorsa) fiziksel bir ikincil ekran bağlayın veya sanal ikincil HU'yu açın:
    1. Ayarlar uygulamasında seçin Geliştirici Modu.
    2. Ayarlar> Sistem> Gelişmiş> Geliştirici seçenekleri> Benzet ikincil ekranlara gidin.
  3. HU'yu yeniden başlatın. ClusterRenderingService hizmeti ikincil ekrana bağlanır.
  4. KitchenSink uygulamasını başlatmak için:
    1. Çekmeceyi açın.
    2. Inst gidin. Küme.
    3. BAŞLANGIÇ metadata tıklayın.

Kitchensink talimatını HAREKET odağı, istekleri DirectRenderingCluster Enstrüman Kümesi üzerinde alay-up kullanıcı arayüzünü görüntülemek için hizmet.