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.
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.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
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:
Na tej ilustracji kolory oznaczają:
- Żółty.
CarService
iCarNavigationStatusManager
które udostępnia platforma Androida. Więcej informacji: Samochód oraz CAR_NAVIGATION_SERVICE - Cyjan. Implementacja „
InstrumentClusterRendererService
” przez OEM. - Fioletowy. aplikację Nawigacja zaimplementowaną przez Google i inne firmy. dla programistów.
- Zielony.
CarAppFocusManager
. Więcej informacji: Korzystanie z interfejsu CarAppFocusManager API poniżej i CarAppFocusManager.
Przepływ informacji o stanie nawigacji ma następującą sekwencję:
CarService
inicjujeInstrumentClusterRenderingService
.- Podczas inicjowania
InstrumentClusterRenderingService
aktualizuje sięCarService
z:- 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).
- Opcje aktywności potrzebne do uruchamiania działań na ekranie klastra instrumentów. Więcej informacji: ActivityOptions.
- aplikacja do nawigacji (np. Mapy Google na Androida Automotive lub dowolna aplikacja z mapami).
z wymaganymi uprawnieniami):
- Pobiera wartość
CarAppFocusManager
, używając klasy Car z car-lib. - Przed uruchomieniem wskazówek zakręt po zakręcie połączenia z
CarAppFocusManager.requestFocus()
, aby zakończyćCarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION
jakoappType
.
- Pobiera wartość
CarAppFocusManager
przekazuje tę prośbę do aplikacjiCarService
. Jeśli przyznasz te uprawnienia,CarService
sprawdza pakiet aplikacji do nawigacji i znajduje aktywność została oznaczona jakoandroid.car.cluster.NAVIGATION
.- Jeśli aplikacja nawigacyjna zostanie znaleziona, użyje
ActivityOptions
zgłoszonego przezInstrumentClusterRenderingService
, 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 tagCarService
:<uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
Wdrażanie usługi InstrumentClusterRenderingService
Aby utworzyć usługę:
- 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. - 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).
- Gdy ekran wskazany powyżej jest gotowy, usługa musi wywołać metodę
InstrumentClusterRenderingService#setClusterActivityLaunchOptions()
, aby określić dokładnyActivityOptions
, którego należy użyć do wyświetlenia aktywności w Klaster instrumentów. Użyj tych parametrów:category.
ClusterRenderingService.ActivityOptions.
InstancjaActivityOptions
, 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));
- 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.
- 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ę:
- 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.
- Podłącz fizyczny wyświetlacz dodatkowy do wyświetlacza HU (jeśli jest obsługiwany) lub włącz wirtualny wyświetlacz.
dodatkowy HU:
- W aplikacji Ustawienia wybierz Tryb programisty.
- Wybierz kolejno Ustawienia > System > Zaawansowane > Opcje programisty > Symulowanie ekranów dodatkowych.
- Restartowanie HU
- Aby uruchomić aplikację KitchenSink:
- Otwórz panel.
- Przejdź do sekcji Inst. Klaster.
- Kliknij ROZPOCZNIJ METADANE.
KitchenSink wymaga fokusu NAVIGATION, który instruuje funkcję DirectRenderingCluster
do wyświetlenia przykładowego interfejsu użytkownika w klastrze instrumentów.