Alet Kümesi

Google Haritalar 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, bu ikincil ekranı kontrol etmek için bir hizmetin nasıl oluşturulacağını ve ardından navigasyon uygulamalarının bir kullanıcı arayüzü gösterebilmesi için hizmeti CarService ile nasıl entegre edeceğini açıklar.

terminoloji

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

Terim Tanım
CarInstrumentClusterManager Harici uygulamaların Gösterge Grubunda bir etkinlik başlatmasını ve Gösterge Grubu etkinlikleri görüntülemeye hazır olduğunda geri aramaları almasını sağlayan bir CarManager .
Araba Yöneticisi CarService tarafından uygulanan araca özel hizmetlerle etkileşim kurmak için harici uygulamalar tarafından kullanılan tüm yöneticilerin temel sınıfı.
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 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 yenisi) alın.
  • 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.
  • Alet Kümesi 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 Automotive'de bulunan Android öykünücüsü, Android öykünücüsü _qemu-pipes ile bir gösterge paneli görüntüleme seçeneği sunar. Bu benzetilmiş harici ekrana bağlanmak için DirectRenderingCluster referans gösterge paneli uygulamasını kullanın.

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 , navigasyon uygulamaları ile araba arasında aracılık yapar ve 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ğlar.

CarService , araca özel tüm hizmetleri önyükler ve bir dizi yönetici aracılığıyla bu hizmetlere erişim sağlar. Servislerle etkileşim kurmak için arabada ç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 Instrument Cluster oluştururken, önyükleme işlemi sırasında CarService , InstrumentClusterService uygulamasını bulmak için config.xml InstrumentClusterRendererService anahtarını okur. 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 girdide atıfta bulunulan hizmet başlatılır ve CarService . Google Haritalar gibi navigasyon uygulamaları bir CarInstrumentClusterManager , CarService bağlı InstrumentClusterRenderingService Instrument Cluster durumunu güncelleyen bir yönetici sağlar. (Bu durumda, bağlı , Android Hizmetlerini ifade eder.)

Alet Kümesi Hizmeti

OEM'ler, InstrumentClusterRendererService . Örnek için ClusterRenderingService bakın.

Bu sınıf iki amaca hizmet eder:

  • Bir arayüz Android ve Enstrüman Kümesi 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ç için, InstrumentClusterRendererService 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 .

İkinci işlev için, Instrument Cluster hizmetinin, bir eventType olarak kodlanmış navigasyon durumu güncelleme olaylarını ve bir pakette kodlanmış olay verilerini alan NavigationRenderer arayüzünün bir uygulamasını sağlaması gerekir.

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

  • Sarı. Android platformu tarafından sağlanan CarService ve CarNavigationStatusManager .
  • camgöbeği. OEM tarafından uygulanan InstrumentClusterRendererService .
  • 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 , InstrumentClusterRenderingService öğesini başlatır.
  2. Başlatma sırasında InstrumentClusterRenderingService , CarService şekilde günceller:
    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. Enstrüman Kümesi ekranında etkinlikleri başlatmak için gereken 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 yol tarifleri başlamadan önce, appType parametresi olarak CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION iletmek için CarAppFocusManager.requestFocus() 'a çağrılar.
  4. CarAppFocusManager bu talebi CarService . Verilirse, CarService navigasyon uygulaması paketini inceler ve android.car.cluster.NAVIGATION kategorisiyle işaretlenmiş bir etkinliği bulur.
  5. Bulunursa, navigasyon uygulaması, etkinliği başlatmak için InstrumentClusterRenderingService tarafından bildirilen ActivityOptions kullanır ve amaca yönelik ekstralar olarak Instrument Cluster görüntüleme özelliklerini içerir.

API'yi entegre etme

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

  • Aşağıdaki değeri AndroidManifest.xml'ye 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"
  • BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE sistem iznine sahip olun. Bu, yalnızca Android sistem görüntüsünün bir parçası olarak dahil edilen Alet Kümesi oluşturma hizmetinin CarService bağlı olduğunu garanti eder:
    <uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
    

InstrumentClusterRenderingService'i Uygulama

Hizmeti oluşturmak için:

  1. InstrumentClusterRenderingService genişleyen bir sınıf yazın ve ardından AndroidManifest.xml dosyanıza karşılık gelen bir giriş ekleyin. Bu sınıf, Alet Kümesi ekranını kontrol eder ve ( isteğe bağlı olarak) Navigasyon 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:
    • 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. Yukarıda belirtilen ekran hazır olduğunda, bu hizmet, Alet Kümesinde bir Aktivite görüntülemek için kullanılması gereken tam ActivityOptions tanımlamak için InstrumentClusterRenderingService#setClusterActivityLaunchOptions() 'ı çağırmalıdır. Bu parametreleri kullanın:
    • kategori. CarInstrumentClusterManager#CATEGORY_NAVIGATION
    • ActivityOptions. Alet Kümesinde bir Aktivite başlatmak için kullanılabilecek bir ActivityOptions örneği. Örneğin, AOSP'deki örnek Araç Kümesi uygulamasından:
      getService().setClusterActivityLaunchOptions(
         CATEGORY_NAVIGATION,
         ActivityOptions.makeBasic()
            .setLaunchDisplayId(displayId));
      
  4. Araç Kümesi etkinlikleri görüntülemeye hazır olduğunda, bu hizmet InstrumentClusterRenderingService#setClusterActivityState() . Bu parametreleri kullanın:
    • category CarInstrumentClusterManager#CATEGORY_NAVIGATION
    • ClusterActivityState ile oluşturulan state Paketi. Aşağıdaki verileri sağladığınızdan emin olun:
      • visible Alet Kümesini görünür ve içeriği görüntülemeye hazır olarak belirtir.
      • unobscuredBounds Enstrüman Kümesi ekranında içeriğin görüntülenmesinin güvenli olduğu alanı tanımlayan bir dikdörtgen. Örneğin, kadranlar ve göstergeler tarafından kapsanan alanlar.
  5. 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, Instrument Cluster içeriğini uzak bir fiziksel ekranda sunmak için bir VirtualDisplay oluşturan bir InstrumentClusterRenderingService uygulamasını özetlemektedir.

Alternatif olarak, mevcut olduğu biliniyorsa, bu kod displayId 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);
  }
}

CarAppFocusManager'ı Kullanma

CarAppFocusManager API, OEM'ler tarafından yazılan küme hizmetinin herhangi bir zamanda hangi navigasyon uygulamasının navigasyon odağı olduğunu bilmesini sağlayan getAppTypeOwner() adlı bir yöntem sağlar. OEM'ler, mevcut CarAppFocusManager#addFocusListener() yöntemini kullanabilir ve ardından hangi uygulamanın odaklandığını öğrenmek için getAppTypeOwner() () yöntemini kullanabilir. 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ğine sahip 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.

Aktif navigasyon veya sesli komut gibi mevcut uygulama odağını ayarlamak ve dinlemek için CarAppFocusManager kullanın. Genellikle böyle bir uygulamanın yalnızca bir örneği sistemde aktif olarak çalışır (veya odaklanır).

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

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
}

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

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 flash'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 (destekleniyorsa) fiziksel bir ikincil ekran bağlayın 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 seçeneğine 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İNİ BAŞLAT'a tıklayın.

KitchenSink, DirectRenderingCluster hizmetine Alet Kümesinde sahte bir kullanıcı arabirimi görüntüleme talimatı veren NAVİGASYON odağını ister.