Alet Kümesi

Gösterge panelindeki direksiyon simidinin arkası gibi bir arabadaki ikincil bir ekranda Google Haritalar dahil navigasyon uygulamalarını görüntülemek için Alet Kümesi API'sini (bir Android API) kullanın. Bu makale, bu ikincil ekranı kontrol etmek için bir hizmetin nasıl oluşturulacağını ve daha sonra navigasyon uygulamalarının bir kullanıcı arabirimi görüntüleyebilmesi için hizmeti CarService ile entegre etmeyi açıklamaktadır.

Terminoloji

Bu makale boyunca aşağıdaki terimler kullanılmaktadır:

Dönem Açıklama
CarInstrumentClusterManager Harici uygulamaların Alet Kümesi üzerinde bir etkinlik başlatmasını ve Alet Kümesi etkinlikleri görüntülemeye hazır olduğunda geri aramaları almasını sağlayan bir CarManager.
CarManager CarService tarafından uygulanan araca özel hizmetlerle etkileşimde bulunmak için harici uygulamalar tarafından kullanılan tüm yöneticilerin temel sınıfı.
Araba servisi Harici uygulamalar (Google Haritalar dahil) ile Alet Kümesi erişimi gibi araca özgü özellikler arasında iletişim sağlayan Android Platform hizmeti.
Hedef Aracın gideceği son hedef.
ETA Hedefe tahmini varış zamanı.
Baş Ünitesi (HU) Bir arabaya yerleştirilmiş 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östergelerinin arasında bulunan ikincil ekran. Bu, aracın dahili ağı (CAN veriyolu) aracılığıyla HU'ya bağlanan 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ı.
Rota Bir aracın bir varış noktasına varmak için seyrettiği belirli bir yol.
Singleton hizmeti Android android:singleUser özniteliğine sahip bir Android hizmeti. 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ını kurmak için bkz. Derleme gereksinimleri .
  • Android kaynak kodunu indirin. Android kaynak kodunun en son sürümünü https://android.googlesource.com adresindeki pi-car-release şubesinden (veya daha sonra) edinin .
  • Baş Ünitesi (HU). Android 9 (veya üstü) çalıştırabilen bir Android cihaz. Bu cihaz kendi ekranına sahip olmalı ve ekranı yeni Android sürümleriyle yanıp sönebilmelidir.
  • Alet Kümesi aşağıdakilerden biridir:
    • HU'ya eklenmiş fiziksel ikincil ekran. Aygıt donanımı ve çekirdek birden çok ekranın yönetimini destekliyorsa.
    • Bağımsız birim. HU'ya bir ağ bağlantısı aracılığıyla bağlanan, kendi ekranında bir video akışını alma ve görüntüleme yeteneğine sahip herhangi bir hesaplama birimi.
    • Öykünülmüş ekran. Geliştirme sırasında, bu benzetilmiş ortamlardan birini kullanabilirsiniz:
      • Simüle edilmiş ikincil ekranlar. Herhangi bir AOSP Android dağıtımında simüle edilmiş ikincil ekranı etkinleştirmek için, Ayarlar sistem uygulamasında Geliştirici Seçenekleri ayarlarına gidin ve ardından İkincil ekranları simüle et öğesini seçin. Bu yapılandırma, bu ekranın birincil ekranın üzerine yerleştirilmesi sınırlamasıyla, fiziksel bir ikincil ekran takmaya eşdeğerdir.
      • Öykünülmüş alet kümesi. Android Automotive'in içerdiği Android öykünücüsü, Android öykünücüsü _qemu-borular içeren bir gösterge grubu görüntüleme seçeneği sunar. Bu öykünülmüş harici ekrana bağlanmak için DirectRenderingCluster referans gösterge paneli uygulamasını kullanın.

Entegrasyon Mimarisi

Entegrasyon Bileşenleri

Instrument Cluster API entegrasyonu şu üç bileşenden oluşur:

  • Araba servisi
  • Navigasyon uygulamaları.
  • OEM Alet Kümesi Hizmeti

Entegrasyon bileşenleri

Araba servisi

CarService, herhangi bir zamanda yalnızca bir navigasyon uygulamasının etkin olmasını ve yalnızca android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL iznine sahip uygulamaların araca veri gönderebilmesini sağlayarak navigasyon uygulamaları ile araç arasında aracılık yapar.

CarService, araca özgü tüm hizmetleri önyükler ve bir dizi yönetici aracılığıyla bu hizmetlere erişim sağlar. Servislerle etkileşim için, araçta çalışan uygulamalar bu yöneticilere erişebilir.

Araç kümesi uygulaması için otomotiv OEM'leri, InstrumentClusterRendererService'in özel bir uygulamasını oluşturmalı ve config.xml dosyasını bu özelleştirilmiş uygulamaya işaret edecek şekilde güncellemelidir.

Bir Alet Kümesi oluştururken, önyükleme işlemi sırasında CarService, InstrumentClusterService uygulamasının yerini belirlemek için config.xml’nin InstrumentClusterRendererService anahtarını okur. AOSP'de bu giriş, Navigasyon Durumu API örnek küme uygulama oluşturma hizmetine işaret eder:

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

Bu girişte atıfta bulunulan hizmet başlatılır ve CarService'e bağlanır. Google Maps gibi navigasyon uygulamaları bir CarInstrumentClusterManager talep ettiğinde, CarService, bağlı InstrumentClusterRenderingService'ten Alet Kümesi durumunu güncelleyen bir yönetici sağlar. (Bu durumda, bağlama , Android Hizmetlerini ifade eder.)

Alet Kümesi Hizmeti

OEM'ler, InstrumentClusterRendererService alt sınıfını içeren bir Android PacKage (APK) oluşturmalıdır. Örnek için ClusterRenderingService konusuna bakın.

Bu sınıf iki amaca hizmet eder:

  • Android ile Alet Kümesi oluşturma cihazı arasında bir arayüz sağlar (bu belgenin amacı).
  • Adım adım navigasyon rehberliği gibi navigasyon durumu güncellemelerini alır ve işler.

İlk amaç için, InstrumentClusterRendererService'in OEM uygulamaları, araç kabinindeki ekranlarda bilgi oluşturmak için kullanılan ikincil ekranı başlatmalı ve bu bilgiyi InstrumentClusterRendererService.setClusterActivityOptions() ve InstrumentClusterRendererService.setClusterActivityState() yöntemlerini arayarak CarService'e iletmelidir.

İkinci işlev için, Araç Kümesi hizmeti, bir olay türü ve bir pakette kodlanmış olay verileri olarak kodlanan gezinme durumu güncelleme olaylarını alan NavigationRenderer arabiriminin bir uygulamasını sağlamalıdır.

Entegrasyon Sırası

Aşağıdaki diyagram, güncellemeleri oluşturan bir gezinme durumunun uygulanmasını göstermektedir:

Entegrasyon sırası

Efsane:

  • Sarı. CarService ve CarNavigationStatusManager, Android platformu tarafından sağlanır.
  • Camgöbeği. OEM tarafından uygulanan InstrumentClusterRendererService.
  • Mor. Google ve üçüncü taraf geliştiriciler tarafından uygulanan Navigasyon uygulaması.
  • Yeşil. CarAppFocusManager.

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

  1. CarService, InstrumentClusterRenderingService'i başlatır.
  2. Başlatma sırasında, InstrumentClusterRenderingService, CarService'i şu şekilde günceller:
    1. Alet Kümesi ekran özellikleri, örneğin belirsiz olmayan sınırlar (belirsiz olmayan sınırlar hakkında daha fazla ayrıntıya daha sonra bakın).
    2. Alet Kümesi ekranındaki etkinlikleri başlatmak için gerekli Etkinlik Seçenekleri (daha fazla ayrıntı için ActivityOptions'a bakın .
  3. Bir navigasyon uygulaması (Android Automotive için Google Haritalar veya gerekli izinlere sahip herhangi bir harita uygulaması gibi):
    1. Car-lib'den Car sınıfını kullanarak bir CarAppFocusManager alır.
    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, bu isteği CarService'e iletir. Verilirse, CarService navigasyon uygulama paketini inceler ve android.car.cluster.NAVIGATION kategorisi ile işaretlenmiş bir etkinliği bulur.
  5. Bulunursa, navigasyon uygulaması, etkinliği başlatmak için InstrumentClusterRenderingService tarafından bildirilen ActivityOptions'ı kullanır ve amaçtaki ekstralar olarak Alet Kümesi görüntüleme özelliklerini içerir.

API entegrasyonu

InstrumentClusterRenderingService uygulaması şunları yapmalıdır:

  • Aşağıdaki değeri AndroidManifest.xml dosyasına ekleyerek tek bir hizmet olarak atanabilirsiniz. Bu, Alet Kümesi hizmetinin tek bir kopyasının, başlatma ve kullanıcı geçişi sırasında bile çalışmasını sağlamak için gereklidir:
    android:singleUser="true"
  • BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE sistem iznini tutun. Bu, yalnızca Android sistem görüntüsünün bir parçası olarak dahil edilen Alet Kümesi oluşturma hizmetinin CarService tarafından her zaman bağlanacağını garanti eder.
    <uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>

InstrumentClusterRenderingService'i Uygulama

Hizmeti oluşturmak için:

  1. InstrumentClusterRenderingService'den genişleyen bir sınıf yazın ve ardından AndroidManifest.xml dosyanıza karşılık gelen bir girdi ekleyin. Bu sınıf, Alet Kümesi ekranını kontrol eder ve ( isteğe bağlı olarak ) Gezinme Durumu API verilerini işleyebilir.
  2. OnCreate () sırasında, işleme donanımıyla iletişimi başlatmak için bu hizmeti kullanın. Seçenekler şunları içerir:
    • Alet Kümesi için kullanılacak ikincil ekranı belirleyin.
    • Instrument Cluster uygulamasının işlenen görüntüyü bir harici birime (H.264 gibi bir video akış formatı kullanarak) aktarması ve iletmesi için sanal bir ekran oluşturun.
  3. Yukarıda gösterilen ekran hazır olduğunda, bu hizmetin Alet Kümesinde bir Aktiviteyi görüntülemek için kullanılması gereken tam ActivityOptions'ı tanımlamak için InstrumentClusterRenderingService # setClusterActivityLaunchOptions () 'ı çağırması gerekir. Şu parametreleri kullanın:
    • kategori. CarInstrumentClusterManager # CATEGORY_NAVIGATION
    • ActivityOptions. Araç Kümesinde bir Activity başlatmak için kullanılabilen bir ActivityOptions örneği. Örneğin, AOSP'deki örnek Alet Kümesi uygulamasından:
      getService().setClusterActivityLaunchOptions(
         CATEGORY_NAVIGATION,
         ActivityOptions.makeBasic()
            .setLaunchDisplayId(displayId));
      
    • Alet Kümesi etkinlikleri görüntülemeye hazır olduğunda, bu hizmet şunları başlatmalıdır:
      InstrumentClusterRenderingService#setClusterActivityState() .

      Şu parametreleri kullanın:
      • kategori. CarInstrumentClusterManager # CATEGORY_NAVIGATION
      • durum. ClusterActivityState ile oluşturulan paket . Aşağıdaki verileri sağlamalısınız:
        • gözle görülür. Alet Kümesini görünür ve içerik görüntülemeye hazır olarak belirtir.
        • unobscuredBounds. Alet Kümesi ekranındaki içeriği görüntülemenin güvenli olduğu alanı tanımlayan bir dikdörtgen. Örneğin, kadranlar ve göstergelerle kaplı alanlar.
    • Service#dump() yöntemini geçersiz kılın ve hata ayıklama için yararlı olan durum bilgilerini bildirin (daha fazla bilgi için dumpsys'e bakın).

Örnek InstrumentClusterRenderingService Uygulaması

Aşağıdaki örnek, bir uzak fiziksel ekranda Araç Kümesi içeriğini sunmak için bir VirtualDisplay oluşturan bir InstrumentClusterRenderingService uygulamasını ana hatlarıyla belirtir.

Alternatif olarak, yukarıda bahsedildiği gibi, alternatif olarak bu kod, eğer mevcut olduğu biliniyorsa, HU'ya bağlı bir fiziksel ikincil ekranın displayId'sini geçebilir.

/**
* 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);
  }
}

Ek: Örnek Uygulamayı Kullanma

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

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

  1. Desteklenen bir HU üzerinde Android Auto'yu 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 Kartlarını Kullanma .
  2. HU'ya fiziksel bir ikincil ekran bağlayın (destekleniyorsa) veya sanal ikincil HU'yu açın:
    1. Ayarlar uygulamasında Geliştirici Modu'nu seçin.
    2. Ayarlar> Sistem> Gelişmiş> Geliştirici seçenekleri> İkincil ekranları simüle et'e 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'e gidin . Küme .
    3. META VERİLERİ BAŞLAT'a tıklayın.

KitchenSink, DirectRenderingCluster hizmetine Alet Kümesi'nde sahte bir kullanıcı arabirimi görüntülemesi talimatını veren NAVIGATION odak ister.