Interfejs API klastra instrumentów

Używać interfejsu Instrument Cluster API (Android API) do wyświetlania aplikacji nawigacyjnych. w tym Mapy Google, na drugim wyświetlaczu w samochodzie, np. z tyłu kierownicę na panelu przyrządów. Na tej stronie dowiesz się, jak utworzyć do kontrolowania tego dodatkowego wyświetlacza i integrowania usługi z CarService, aby aplikacje do nawigacji mogły wyświetlać za pomocą prostego interfejsu online.

Terminologia

Na tej stronie używane są następujące terminy.

Menedżer klastra instrumentów samochodowych
Wystąpienie CarManager, które umożliwia aplikacjom zewnętrznym uruchamianie aktywności do klastra instrumentów i otrzymywać wywołania zwrotne, gdy klaster instrumentów jest gotowy do wyświetlenia. aktywności.
Menedżer firmy
Klasa podstawowa obejmująca wszystkich menedżerów używanych przez aplikacje zewnętrzne do interakcji z konkretnym samochodem usług wdrożonych przez CarService.
CarService
Usługa Platforma Android zapewniająca komunikację między zewnętrznymi aplikacjami (w tym Mapy Google) i funkcji typowych dla samochodów, takich jak dostęp do klastra przyrządów.
Miejsce docelowe
Docelowe miejsce docelowe, do którego ma dotrzeć pojazd.
Szacowany czas dotarcia na miejsce
Szacowany czas dotarcia do miejsca docelowego.
Jednostka centralna (HU)
Główna jednostka obliczeniowa umieszczona w samochodzie. HU działa na Androidzie cały kod podłączonym do centralnego wyświetlacza w samochodzie.
Grupa instrumentów
Dodatkowy wyświetlacz za kierownicą i między samochodem instrumenty. Może to być niezależna jednostka obliczeniowa połączona HU w sieci wewnętrznej samochodu (magistrala CAN) lub wyświetlaczu dodatkowym. połączone z panelem HU.
Usługa renderowania InstrumentCluster
Klasa podstawowa usługi używanej do interfejsu z klastrem instrumentów wyświetlacz. OEM musi dostarczyć rozszerzenie tej klasy, które współdziała z na sprzęcie używanym przez OEM.
Aplikacja KitchenSink
Aplikacja testowa dostępna na Androidzie Automotive
Trasa
Konkretna ścieżka, którą pokonuje pojazd, aby dotrzeć do celu.
Usługa Singleton
Usługa na Androida z atrybutem android:singleUser. Na w danym momencie w systemie Android działa co najmniej 1 instancja usługi.

Wymagania wstępne

Zanim przejdziesz dalej, przygotuj te elementy:

  • Środowisko programistyczne Androida. Aby skonfigurować Androida środowiska programistycznego, patrz Wymagania dotyczące kompilacji.
  • Pobierz kod źródłowy Androida. Pobierz najnowszą wersję kodu źródłowego Androida z gałęzi pi-car-release (lub nowszej) na stronie https://android.googlesource.com
  • Jednostka główna (HU). Urządzenie z Androidem, które może działać Android 9 (lub nowszy). Urządzenie to musi mieć własny wyświetlacz i umożliwiać nowe wersje Androida.
  • Klaster instrumentów jest jednym z następujących:
    • Fizyczny wyświetlacz dodatkowy podłączony do HU. Jeśli sprzęt i jądro obsługują zarządzanie wieloma wyświetlaczami.
    • Niezależna jednostka. Każda jednostka obliczeniowa podłączona do HUD przez połączenie sieciowe, umożliwiający odbieranie i wyświetlanie strumienia wideo. na własnym wyświetlaczu.
    • Wyświetlacz emulowany. W trakcie programowania możesz wykorzystać jedną z tych opcji: tych emulowanych środowiskach:
      • Symulowane ekrany dodatkowe. Aby włączyć symulowany w dowolnej dystrybucji AOSP na Androida, otwórz Opcje programisty. w aplikacji systemowej Ustawienia, a następnie wybierz Symuluj funkcję dodatkową wyświetla. Ta konfiguracja odpowiada podłączeniu fizycznego dodatkowego źródła sygnału. z tym ograniczeniem, że jest on nałożony na główny wyświetlacz.
      • Emulowany klaster przyrządów. Emulator Androida zawiera z AAOS pozwala wyświetlić grupę przyrządów ClusterRenderingService.

Architektura integracji

Komponenty integracji

Integracja z interfejsem Instrument Cluster API składa się z tych 3 komponentów:

  • CarService
  • Aplikacje do nawigacji
  • Usługa klastra instrumentów OEM

Komponenty integracji

CarService

CarService pośredniczy między aplikacjami do nawigacji a samochodem, dzięki czemu tylko aktywna jest tylko jedna aplikacja do nawigacji i tylko aplikacje z Uprawnienie android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL może wysyłać dane do samochodu.

CarService wczytuje wszystkie usługi związane z samochodem i zapewnia dostęp do przez szereg menedżerów. Aby korzystać z usług, aplikacje działające w samochodzie mają do nich dostęp.

Aby wdrożyć klaster przyrządów, firmy motoryzacyjne OEM muszą utworzyć niestandardowy implementacji InstrumentClusterRendererService i zaktualizowanie ClusterRenderingService.

Podczas renderowania klastra instrumentów podczas uruchamiania CarService odczytuje klucz InstrumentClusterRendererService funkcji ClusterRenderingService aby znaleźć implementację tagu InstrumentClusterService. W AOSP ten wpis wskazuje usługę renderowania przykładowego klastra Navigation State API:

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

Usługa, o której mowa w tym wpisie, została zainicjowana i powiązana z CarService Gdy aplikacje do nawigacji, np. Mapy Google, proszą o CarInstrumentClusterManager, CarService zapewnia menedżera, który: aktualizuje stan klastra instrumentów z wartości InstrumentClusterRenderingService. (W tym przypadku określenie bound odnosi się do Android Usługi).

Usługa klastra przyrządów

OEM musi utworzyć pakiet Android (APK) zawierający podklasę ClusterRenderingService.

Te zajęcia służą do 2 celów:

  • Udostępnia interfejs Android i urządzenie renderujące klaster przyrządów (przeznaczenie tej strony).
  • Odbiera i renderuje aktualizacje stanu nawigacji, np. zakręt po zakręcie wskazówek nawigacji.

W pierwszym celu implementacje OEM (InstrumentClusterRendererService) musi zainicjować dodatkowy wyświetlacz służący do wyświetlania informacji na ekranach w kabinie samochodu przekaż te informacje firmie CarService, dzwoniąc pod numer InstrumentClusterRendererService.setClusterActivityOptions() i InstrumentClusterRendererService.setClusterActivityState() metod.

W przypadku drugiej funkcji usługa klastra przyrządów musi udostępniać implementacji Usługa ClusterRenderingService który otrzymuje zdarzenia aktualizacji stanu nawigacji, które są kodowane jako eventType i dane zdarzeń zakodowane w pakiecie.

Sekwencja integracji

Poniższy diagram przedstawia implementację stanu nawigacji który renderuje aktualizacje:

Sekwencja integracji

Na tej ilustracji kolory oznaczają:

Przepływ informacji o stanie nawigacji ma następującą sekwencję:

  1. CarService inicjuje InstrumentClusterRenderingService.
  2. Podczas inicjowania InstrumentClusterRenderingService aktualizuje się CarService z:
    1. Właściwości wyświetlania klastra przyrządów, takie jak niezasłonięte granice (więcej informacji o nieczytelnych granicach znajdziesz później).
    2. Opcje aktywności potrzebne do uruchamiania działań na ekranie klastra instrumentów. Więcej informacji: ActivityOptions.
  3. aplikacja do nawigacji (np. Mapy Google na Androida Automotive lub dowolna aplikacja z mapami). z wymaganymi uprawnieniami):
    1. Pobiera wartość CarAppFocusManager, używając klasy Car z car-lib.
    2. Przed uruchomieniem wskazówek zakręt po zakręcie połączenia z CarAppFocusManager.requestFocus(), aby zakończyć CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION jako appType .
  4. CarAppFocusManager przekazuje tę prośbę do aplikacji CarService. Jeśli przyznasz te uprawnienia, CarService sprawdza pakiet aplikacji do nawigacji i znajduje aktywność została oznaczona jako android.car.cluster.NAVIGATION.
  5. Jeśli aplikacja nawigacyjna zostanie znaleziona, użyje ActivityOptions zgłoszonego przez InstrumentClusterRenderingService, aby uruchomić aktywność, i zawiera Właściwości wyświetlania klastra instrumentów jako dodatki w intencji.

Integracja interfejsu API

Implementacja InstrumentClusterRenderingService musi:

  • zostać wyznaczona jako usługa singleton przez dodanie tej wartości do w pliku AndroidManifest.xml. Jest to konieczne, aby mieć pewność, że jedna kopia pliku Usługa klastra instrumentów działa nawet podczas inicjowania i przełączenia użytkownika:
    android:singleUser="true"
  • Zachowaj uprawnienia systemowe BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE. Ten daje gwarancję, że tylko usługa renderowania klastra instrumentów jest częścią obrazu systemu Android jest zawsze ograniczony przez tag CarService:
    <uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
    

Wdrażanie usługi InstrumentClusterRenderingService

Aby utworzyć usługę:

  1. Utwórz zajęcia, które rozpoczynają się od Usługa ClusterRenderingService a następnie dodaj odpowiedni wpis do pliku AndroidManifest.xml. Te zajęcia kontroluje wyświetlanie klastra przyrządów i (opcjonalnie) może renderować stan nawigacji. Dane interfejsu API.
  2. Podczas onCreate() używaj tej usługi do zainicjowania komunikacji z sprzęt do renderowania. Dostępne opcje:
    • Określ wyświetlacz dodatkowy, który będzie używany przez klaster instrumentów.
    • Utwórz wirtualny wyświetlacz, by aplikacja Klaster instrumentów renderowała i przesyłała do jednostki zewnętrznej (przy użyciu formatu strumieniowania wideo, np. H.264).
  3. Gdy ekran wskazany powyżej jest gotowy, usługa musi wywołać metodę InstrumentClusterRenderingService#setClusterActivityLaunchOptions(), aby określić dokładny ActivityOptions, którego należy użyć do wyświetlenia aktywności w Klaster instrumentów. Użyj tych parametrów:
    • category. ClusterRenderingService.
    • ActivityOptions. Instancja ActivityOptions, która może być używane do uruchomienia działania w klastrze instrumentów. Na przykład z pliku Implementacja klastra instrumentów w AOSP:
      getService().setClusterActivityLaunchOptions(
        CATEGORY_NAVIGATION,
        ActivityOptions.makeBasic()
            .setLaunchDisplayId(displayId));
  4. Gdy klaster instrumentów jest gotowy do wyświetlania działań, ta usługa musi wywołać InstrumentClusterRenderingService#setClusterActivityState() Użyj tych parametry:
    • category ClusterRenderingService.
    • Pakiet state wygenerowany za pomocą ClusterRenderingService. Podaj te dane:
      • visible Określa klaster instrumentów jako widoczny i gotowy do do wyświetlania treści.
      • unobscuredBounds Prostokąt, który określa obszar wewnątrz Wyświetlacz klastra przyrządów, w którym można bezpiecznie wyświetlać treści. Na przykład: tarczami i miernikami.
  5. Zastąp informacje o stanie metody Service#dump() i raporty przydatne w przypadku debugowanie (patrz dumpsys), ).

Przykładowa implementacja usługi InstrumentClusterRenderingService

W przykładzie poniżej podano InstrumentClusterRenderingService w którym tworzy się VirtualDisplay do zaprezentowania Instrumentu Grupowanie treści na zdalnym wyświetlaczu fizycznym.

Ten kod może też przekazywać displayId fizycznego obiektu dodatkowego podłączony do wyświetlacza HU, jeśli taki jest dostępny.

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

Używanie interfejsu CarAppFocusManager API

Interfejs CarAppFocusManager API udostępnia metodę o nazwie getAppTypeOwner(), która umożliwia usłudze klastra napisanej przez OEM, aby dowiedzieć się, która aplikacja nawigacyjna jest skoncentrowana w danym momencie obecnie się znajdujesz. OEM może używać istniejącej metody CarAppFocusManager#addFocusListener(). a następnie użyj opcji getAppTypeOwner(), aby sprawdzić, na której aplikacji należy się skupić. Dzięki tym informacjom OEM może:

  • Przełącz aktywność wyświetlaną w klastrze na aktywność w klastrze udostępniana przez aplikację do nawigacji utrzymywania ostrości.
  • Może wykrywać, czy zaznaczona aplikacja do nawigacji ma aktywność związaną z klastrem. Jeśli zaznaczony aplikacja nawigacyjna nie wykrywa aktywności w klastrze (lub jeśli jest ona wyłączona), producenci OEM mogą wysyłać ten sygnał do DIM w samochodzie, aby aspekt nawigacji klastra został całkowicie pominięty.

Naciśnij CarAppFocusManager, aby ustawić i nasłuchiwać bieżący obszar aplikacji, taki jak aktywna nawigacja lub polecenie głosowe. Zazwyczaj aktywne jest tylko jedno wystąpienie takiej aplikacji. podczas pracy (lub skupienia) w systemie.

Używaj metody CarAppFocusManager#addFocusListener(..) do nasłuchiwania koncentracji w aplikacji zmiany:

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
}

Użyj metody CarAppFocusManager#getAppTypeOwner(..), aby pobrać pakiet nazwy obecnego właściciela aplikacji danego typu, o którym mowa. Ta metoda może zwrócić więcej niż jedną nazwę pakietu, jeśli obecny właściciel używa funkcji android:sharedUserId.

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
}

...

Dodatek: używanie przykładowej aplikacji

AOSP udostępnia przykładową aplikację, która wdraża interfejs Navigation State API.

Aby uruchomić tę przykładową aplikację:

  1. Kompiluj i flashuj Androida Auto na obsługiwanym wyświetlaczu HU. Użyj Instrukcje tworzenia i aktualizowania Androida dotyczące Twojego urządzenia. Instrukcje znajdziesz w materiałach na temat Korzystanie z tablic referencyjnych.
  2. Podłącz fizyczny wyświetlacz dodatkowy do wyświetlacza HU (jeśli jest obsługiwany) lub włącz wirtualny wyświetlacz. dodatkowy HU:
    1. W aplikacji Ustawienia wybierz Tryb programisty.
    2. Wybierz kolejno Ustawienia > System > Zaawansowane > Opcje programisty > Symulowanie ekranów dodatkowych.
  3. Restartowanie HU
  4. Aby uruchomić aplikację KitchenSink:
    1. Otwórz panel.
    2. Przejdź do sekcji Inst. Klaster.
    3. Kliknij ROZPOCZNIJ METADANE.

KitchenSink wymaga fokusu NAVIGATION, który instruuje funkcję DirectRenderingCluster do wyświetlenia przykładowego interfejsu użytkownika w klastrze instrumentów.