Klaster instrumentów

Użyj interfejsu API klastra instrumentów (Android API), aby wyświetlać aplikacje nawigacyjne, w tym Mapy Google, na dodatkowym wyświetlaczu w samochodzie, takim jak za kierownicą na tablicy rozdzielczej. Ta strona opisuje jak stworzyć serwis w celu skontrolowania czy dodatkowy wyświetlacz i następnie zintegrować usługi CarService tak aby aplikacje nawigacyjne mogą wyświetlać interfejs użytkownika.

Terminologia

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

Semestr Opis
CarInstrumentClusterManager CarManager który umożliwia aplikacji zewnętrznych do rozpoczęcia działalności na instrumencie Klastra i odbierać wywołania zwrotne, gdy Instrument Cluster jest gotowy do wyświetlania działań.
Menedżer samochodów Klasa bazowa wszystkich menedżerów wykorzystywanych przez aplikacje zewnętrzne interakcję z usługami samochód specyficznych realizowanych przez CarService .
CarService Usługa platformy Android, która zapewnia komunikację między aplikacjami zewnętrznymi (w tym Google Maps) a funkcjami specyficznymi dla samochodu, takimi jak dostęp do zestawu wskaźników.
Miejsce docelowe Ostateczny cel, do którego będzie nawigować pojazd.
ETA Szacowany czas przybycia do celu.
Jednostka główna (HU) Podstawowa jednostka obliczeniowa wbudowana w samochód. HU uruchamia cały kod Androida i jest podłączony do centralnego wyświetlacza w samochodzie.
Klaster instrumentów Dodatkowy wyświetlacz umieszczony za kierownicą i między przyrządami samochodowymi. Może to być niezależna jednostka obliczeniowa podłączona do HU za pośrednictwem wewnętrznej sieci samochodu (magistrala CAN) lub dodatkowy wyświetlacz podłączony do HU.
InstrumentClusterRenderingService Klasa podstawowa usługi używanej do połączenia z wyświetlaczem zestawu wskaźników. Producenci OEM muszą zapewnić rozszerzenie tej klasy, które współdziała ze sprzętem specyficznym dla OEM.
Aplikacja KitchenSink Aplikacja testowa dołączona do Android Automotive.
Trasa Określona ścieżka, po której porusza się pojazd, aby dotrzeć do celu.
Usługa Singleton Usługa Android z android:singleUser atrybutu. W danym momencie na systemie Android działa najwyżej jedna instancja usługi.

Warunki wstępne

Aby rozwinąć integrację, upewnij się, że masz te elementy:

  • Środowisko programistyczne Androida. Aby skonfigurować środowisko programistyczne Android, patrz wymagania Build .
  • Pobierz kod źródłowy Androida. Pobierz najnowszą wersję kodu źródłowego Androida z branży pi-car uwalnianiu (lub nowszy) na https://android.googlesource.com .
  • Jednostka główna (HU). Urządzenie z Androidem obsługujące system Android 9 (lub nowszy). To urządzenie musi mieć własny wyświetlacz i mieć możliwość flashowania wyświetlacza w nowych kompilacjach Androida.
  • Instrument Cluster to jedna z poniższych sytuacji:
    • Fizyczny wyświetlacz dodatkowy dołączony do HU. Czy sprzęt i jądro urządzenia obsługują zarządzanie wieloma wyświetlaczami.
    • Niezależna jednostka. Dowolna jednostka obliczeniowa podłączona do HU za pośrednictwem połączenia sieciowego, zdolna do odbierania i wyświetlania strumienia wideo na własnym wyświetlaczu.
    • Emulowany wyświetlacz. Podczas programowania możesz użyć jednego z tych emulowanych środowisk:
      • Symulowane wyświetlacze dodatkowe. Aby włączyć symulowany wyświetlacz dodatkowy w dowolnej dystrybucji systemu AOSP Android, przejdź do ustawień Opcje programisty w aplikacji systemowej Ustawienia, a następnie wybierz opcję Symuluj wyświetlacze dodatkowe. Ta konfiguracja jest równoznaczna z podłączeniem fizycznego wyświetlacza pomocniczego, z ograniczeniem, że ten wyświetlacz jest nałożony na wyświetlacz główny.
      • Emulowany zestaw wskaźników. Android emulatora dołączone Android Automotive zapewnia możliwość wyświetlania klastra wskaźników z Android emulatora _qemu-rur . Użyj DirectRenderingCluster wdrożenie odniesienia zestawu wskaźników, aby połączyć się naśladowane zewnętrznym wyświetlaczu.

Architektura integracyjna

Komponenty integracyjne

Każda integracja interfejsu Instrument Cluster API składa się z tych trzech komponentów:

  • CarService
  • Aplikacje nawigacyjne
  • Usługa klastra instrumentów OEM

Komponenty integracyjne

Serwis samochodowy

CarService pośredniczy pomiędzy aplikacjami nawigacyjnymi i samochodu, zapewniając, że tylko jedna aplikacja nawigacja jest aktywna w danym momencie i aplikacje tylko z android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL uprawnieniem może wysyłać dane do samochodu.

CarService siłach wszystkie usługi auto-specyficzne i zapewnia dostęp do tych usług poprzez serię menedżerów. Aby wchodzić w interakcję z usługami, aplikacje działające w samochodzie mogą uzyskać dostęp do tych menedżerów.

Dla realizacji zestawu wskaźników, producenci samochodów muszą utworzyć niestandardową implementację InstrumentClusterRendererService i zaktualizować config.xml plik na punkcie tej niestandardowej implementacji.

Podczas renderowania klastra Instrument, podczas procesu bootowania CarService czyta InstrumentClusterRendererService klucz od config.xml , aby zlokalizować implementację InstrumentClusterService . W AOSP ten wpis wskazuje na przykładową usługę renderowania implementacji klastra interfejsu Navigation State API:

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

Usługa, o której mowa w tym wpisie jest inicjowany i związany CarService . Kiedy aplikacje nawigacyjne, jak Google Maps, zażądać CarInstrumentClusterManager , CarService zapewnia menedżera, który aktualizuje stan Instrument Cluster z oprawionego InstrumentClusterRenderingService . (W tym przypadku, granica dotyczy Android Services ).

Usługa klastra instrumentów

OEM musi utworzyć pakiet Android (APK), który zawiera podklasę InstrumentClusterRendererService . Zobacz ClusterRenderingService dla próbki.

Ta klasa służy dwóm celom:

  • Zapewnia interfejs Android i urządzenie renderujące Instrument Cluster (cel tej strony).
  • Odbiera i renderuje aktualizacje stanu nawigacji, takie jak szczegółowe wskazówki nawigacyjne.

Dla pierwszego celu, implementacje OEM InstrumentClusterRendererService musi zainicjować wyświetlacz wtórnego stosowane w celu zapewnienia informacji na temat ekranów w kabinie samochodu i przekazują te informacje CarService dzwoniąc do InstrumentClusterRendererService.setClusterActivityOptions() i InstrumentClusterRendererService.setClusterActivityState() metody.

Dla drugiej funkcji, obsługa Instrument Cluster musi zapewnić realizację NavigationRenderer interfejs, który odbiera zdarzenia aktualizacji statusu nawigacyjnego, które są zakodowane jako eventType i zdarzeń danych zakodowanych w wiązce.

Sekwencja integracji

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

Sekwencja integracji

Na tej ilustracji kolory oznaczają:

  • Żółty. CarService i CarNavigationStatusManager dostarczane przez platformę Android.
  • Cyjan. InstrumentClusterRendererService realizowany przez producenta OEM.
  • Purpurowy. Aplikacja nawigacyjna zaimplementowana przez Google i deweloperów zewnętrznych.
  • Zielony. CarAppFocusManager .

Przepływ informacji o stanie nawigacji jest zgodny z następującą sekwencją:

  1. CarService inicjuje InstrumentClusterRenderingService .
  2. Podczas inicjalizacji InstrumentClusterRenderingService aktualizuje CarService z:
    1. Właściwości wyświetlania zestawu wskaźników, takie jak niejasne granice (więcej szczegółów na temat niejasnych granic znajdziesz później).
    2. Opis działań niezbędnych do działania nośnych wewnątrz wyświetlacza Instrument Cluster (więcej szczegółów na ActivityOptions .
  3. Aplikacja do nawigacji (np. Mapy Google dla Androida Automotive lub dowolna aplikacja do map z wymaganymi uprawnieniami):
    1. Uzyskuje CarAppFocusManager użyciu klasy samochód z car-lib.
    2. Przed rozpoczęciem turn-by-turn kierunki wywołania CarAppFocusManager.requestFocus() , aby przejść CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION jako appType parametru.
  4. CarAppFocusManager komunikuje tę prośbę do CarService . Jeśli przyznane CarService kontroluje nawigację aplikacji pakietu i lokalizuje aktywność oznaczoną kategorii android.car.cluster.NAVIGATION .
  5. W przypadku stwierdzenia, aplikacja nawigacji wykorzystuje ActivityOptions donosi InstrumentClusterRenderingService rozpoczęcie działalności i zawiera właściwości wyświetlania Instrument klastra jako dodatki w intencją.

Integracja API

InstrumentClusterRenderingService koniecznością wdrożenia:

  • Być wyznaczonym jako usługa singleton, dodając następującą wartość do pliku AndroidManifest.xml. Jest to konieczne, aby zapewnić, że jedna kopia usługi Instrument Cluster będzie działać, nawet podczas inicjalizacji i przełączania użytkownika:
    android:singleUser="true"
  • Trzymając BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE uprawnienie systemu. Gwarantuje to, że tylko usługi utylizacyjne Instrument Cluster włączone jako część systemu Android obrazu jest zawsze związani CarService :
    <uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
    

Wdrażanie usługi InstrumentClusterRenderingService

Aby zbudować usługę:

  1. Napisz klasy, która rozciąga się od InstrumentClusterRenderingService a następnie dodać odpowiedni wpis do AndroidManifest.xml pliku. Klasa ta steruje wyświetlaniem Instrument Cluster i może (opcjonalnie) czyni dane API Nawigacja państwowe.
  2. Podczas onCreate() , skorzystać z tej usługi, aby zainicjować komunikację ze sprzętem renderowania. Opcje obejmują:
    • Określ drugi wyświetlacz, który będzie używany w zestawie wskaźników.
    • Utwórz wirtualny wyświetlacz, aby aplikacja Instrument Cluster renderowała i przesyłała renderowany obraz do jednostki zewnętrznej (przy użyciu formatu strumieniowego przesyłania wideo, takiego jak H.264).
  3. Gdy na wyświetlaczu wskazany powyżej jest gotowy, usługa ta musi wywołać InstrumentClusterRenderingService#setClusterActivityLaunchOptions() w celu określenia dokładnych ActivityOptions , które muszą być używane do wyświetlania aktywności na Instrument Cluster. Użyj tych parametrów:
    • Kategoria. CarInstrumentClusterManager#CATEGORY_NAVIGATION
    • ActivityOptions. ActivityOptions instancji, które mogą być wykorzystane do uruchomienia działalność w przyrządzie Cluster. Na przykład, z próbki realizacji Instrument Cluster AOSP:
      getService().setClusterActivityLaunchOptions(
         CATEGORY_NAVIGATION,
         ActivityOptions.makeBasic()
            .setLaunchDisplayId(displayId));
      
  4. Gdy Instrument Cluster jest gotowy do wyświetlania działań, usługa ta musi powołać InstrumentClusterRenderingService#setClusterActivityState() . Użyj tych parametrów:
    • category CarInstrumentClusterManager#CATEGORY_NAVIGATION
    • state Bundle generowane z ClusterActivityState . Pamiętaj, aby podać następujące dane:
      • visible Określa zestawie wskaźników jako widoczne i gotowe do wyświetlania zawartości.
      • unobscuredBounds prostokąt definiujący obszar wewnątrz wyświetlacza Instrument Cluster, w którym można bezpiecznie zawartości wyświetlacza. Na przykład obszary objęte tarczami i wskaźnikami.
  5. Przesłonić Service#dump() informacje o stanie metody i sprawozdania przydatnych do debugowania (patrz dumpsys aby uzyskać więcej informacji).

Przykładowe wdrożenie usługi renderowania klastra InstrumentCluster

Poniższy przykład przedstawia się InstrumentClusterRenderingService wdrożenia, która tworzy VirtualDisplay przedstawić treść Instrument Cluster na zdalnym wyświetlaczu fizycznej.

Alternatywnie, kod może przejść displayId fizycznego wyświetlaczu wtórnym podłączonym do HU, jeśli wiadomo, że są dostępne.

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

Korzystanie z CarAppFocusManager

CarAppFocusManager API zapewnia metodę o nazwie getAppTypeOwner() , która umożliwia usługę klastra napisany przez producentów OEM, aby wiedzieć, które nawigacji aplikacja ma ostrość nawigacji w dowolnym momencie. Producenci OEM mogą korzystać z istniejących CarAppFocusManager#addFocusListener() metodę, a następnie użyj getAppTypeOwner() , aby dowiedzieć się, która aplikacja ma ostrości. Dzięki tym informacjom producenci OEM mogą:

  • Przełącz aktywność pokazaną w klastrze na aktywność klastra zapewnianą przez aplikację nawigacyjną z fokusem.
  • Może wykryć, czy skoncentrowana aplikacja nawigacyjna ma aktywność klastra, czy nie. Jeśli skoncentrowana aplikacja nawigacyjna nie ma aktywności klastra (lub jeśli taka aktywność jest wyłączona), producenci OEM mogą wysłać ten sygnał do samochodowego modułu DIM, aby całkowicie pominąć aspekt nawigacji klastra.

Zastosowanie CarAppFocusManager ustawić i słuchać bieżącego naciskiem aplikacji, takich jak aktywnej nawigacji lub polecenia głosowego. Zwykle tylko jedna instancja takiej aplikacji jest aktywnie uruchomiona (lub skupiona) w systemie.

Użyj CarAppFocusManager#addFocusListener(..) metodę do nasłuchiwania aplikacji zmian ostrości:

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 CarAppFocusManager#getAppTypeOwner(..) metody pobierania nazwy pakietów obecnego właściciela danego typu aplikacji, która jest w centrum uwagi. Metoda ta może powrócić nazwę więcej niż jeden pakiet, jeśli obecny właściciel korzysta z android:sharedUserId funkcję.

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
}

...

Załącznik: Korzystanie z przykładowej aplikacji

AOSP udostępnia przykładową aplikację, która implementuje interfejs API stanu nawigacji.

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

  1. Twórz i flashuj Androida Auto na obsługiwanym HU. Skorzystaj z instrukcji tworzenia i flashowania Androida właściwych dla Twojego urządzenia. Aby uzyskać instrukcje, zobacz Używanie odwołań Boards .
  2. Podłącz fizyczny wyświetlacz pomocniczy do HU (jeśli jest obsługiwany) lub włącz wirtualny dodatkowy HU:
    1. Wybierz tryb programisty w aplikacji Ustawienia.
    2. Przejdź do Ustawienia> System> Zaawansowane> Opcje programisty> symulować wyświetlaczach drugorzędnych.
  3. Uruchom ponownie HU. ClusterRenderingService usługa jest podłączony do monitora pomocniczego.
  4. Aby uruchomić aplikację KitchenSink:
    1. Otwórz szufladę.
    2. Idź do Inst. Cluster.
    3. Kliknij START metadanych.

Kitchensink żąda NAWIGACJA ostrości, który określa DirectRenderingCluster usługę do wyświetlania wyśmiewali się interfejs użytkownika na instrumencie Cluster.