Dodawanie obsługi systemu operacyjnego Android Automotive do aplikacji parkowanej

Podczas rozpowszechniania aplikacji na urządzenia z systemem operacyjnym Android Automotive należy wziąć pod uwagę pewne kwestie związane z tym formatem. Ten przewodnik wyjaśnia te kwestie.

Testowanie dotychczasowej aplikacji na emulatorze systemu operacyjnego Android Automotive

Aby zacząć tworzyć aplikację na system operacyjny Android Automotive, najpierw przetestuj dotychczasową aplikację na emulatorze tego systemu. Aby skonfigurować emulator, wykonaj czynności opisane w sekcji Testowanie za pomocą emulatora systemu operacyjnego Android Automotive. Następnie możesz uruchomić aplikację, postępując zgodnie z instrukcjami w Uruchamianie aplikacji na emulatorze.

Podczas uruchamiania aplikacji zwróć uwagę na problemy ze zgodnością, takie jak:

Konfigurowanie pliku manifestu aplikacji

Aby kierować aplikację na urządzenia z systemem operacyjnym Android Automotive, musisz dodać do niej określone wpisy w pliku manifestu. Gdy zdecydujesz się na rozpowszechnianie aplikacji na urządzenia z systemem operacyjnym Android Automotive, Google Play sprawdzi, czy aplikacje są zgodne z tym systemem, aby upewnić się, że można ich bezpiecznie używać w samochodzie. Więcej informacji znajdziesz w artykule Rozpowszechnianie w samochodach.

Wymagane funkcje systemu operacyjnego Android Automotive

Wszystkie aplikacje utworzone na system operacyjny Android Automotive muszą spełniać określone wymagania, aby można je było rozpowszechniać w Google Play. Więcej informacji znajdziesz w artykule Spełnianie wymagań dotyczących funkcji Google Play.

Wpisy w pliku manifestu dotyczące określonej kategorii

Oprócz powyższych wymagań, które dotyczą wszystkich aplikacji na system operacyjny Android Automotive, kategorie wideo i gier mają dodatkowe wymagania:

Spełnianie wymagań dotyczących rozpraszania uwagi kierowcy

Podczas tworzenia aplikacji na samochody bardzo ważne jest, aby nie rozpraszać uwagi kierowcy. W przypadku aplikacji zaparkowanych osiąga się to głównie przez uniemożliwienie korzystania z aplikacji lub odtwarzania dźwięku, gdy aktywne są ograniczenia dotyczące wygody użytkowników (UX), zgodnie z DD-2 i DD-3 wskazówkami dotyczącymi jakości.

Blokowanie korzystania z aplikacji, gdy aktywne są ograniczenia dotyczące wygody użytkowników

Domyślnie nie można używać ani uruchamiać aktywności, gdy aktywne są ograniczenia dotyczące wygody użytkowników. Aby zapewnić, że to zachowanie będzie dotyczyć Twojej aplikacji, nie może ona zawierać w żadnym elemencie <activity> w pliku manifestu tego elementu following <meta-data>:

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

Jeśli aktywność w Twojej aplikacji zostanie wznowiona , gdy aktywne są ograniczenia dotyczące wygody użytkowników, zostanie ona zasłonięta przez aktywność należącą do systemu operacyjnego.

Co najmniej aktywność Twojej aplikacji przechodzi w stan cyklu życia Wstrzymana. Dzieje się tak w przypadku wywołania zwrotnego cyklu życia onPause, podczas którego musisz wstrzymać odtwarzanie wideo i dźwięku w aplikacji.

Na urządzeniach, które obsługują tryb zgodności z systemem operacyjnym Android Automotive , blokowanie przez system powoduje, że aktywności aplikacji przechodzą ze stanu Wstrzymana do stanu Zatrzymana.

Zatrzymywanie odtwarzania i uniemożliwianie jego wznowienia

W przypadku niektórych aplikacji wstrzymanie odtwarzania podczas wywołania zwrotnego onPause() i śledzenie stanu, aby uniemożliwić wznowienie odtwarzania do czasu wywołania zwrotnego onResume(), wystarczy, aby spełnić wymagania dotyczące rozpraszania uwagi kierowcy.

Jeśli reagowanie na wywołania zwrotne cyklu życia nie wystarczy w przypadku Twojej aplikacji, możesz bezpośrednio nasłuchiwać stanu ograniczeń dotyczących wygody użytkowników, jak opisano w następnej sekcji. Na przykład aplikacje, które obsługują tryb obraz w obrazie, mogą woleć bezpośrednie nasłuchiwanie zamiast sprawdzania warunków w wywołaniach zwrotnych cyklu życia.

Nasłuchiwanie ograniczeń dotyczących wygody użytkowników

Aby nasłuchiwać ograniczeń dotyczących wygody użytkowników, najpierw dodaj zależność od biblioteki android.car w pliku build.gradle modułu aplikacji. Jest to rozszerzenie pakietu Android SDK, które udostępnia interfejsy API specyficzne dla systemu operacyjnego Android Automotive.

android {
    ...
    useLibrary("android.car")
}

Użyj CarUxRestrictionsManager, aby odczytać stan ograniczeń dotyczących wygody użytkowników. Nie próbuj określać stanu ograniczeń dotyczących wygody użytkowników na podstawie innych stanów sprzętu, takich jak bieg czy prędkość, ponieważ ograniczenia dotyczące wygody użytkowników mogą się różnić w zależności od wyświetlacza w pojeździe.

val car = Car.createCar(context) ?: return
val carUxRestrictionsManager =
    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as? CarUxRestrictionsManager ?: return

// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentCarUxRestrictions

// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions ->
    // Handle UX restrictions
}

// Don't forget to teardown and release resources when they're no longer needed
carUxRestrictionsManager.unregisterListener()
car.disconnect()

Jedyną wartością udostępnianą przez CarUxRestrictions, do której odwołuje się Twoja aplikacja , jest wartość zwracana przez isRequiresDistractionOptimization. Inne wartości są istotne tylko w przypadku aktywności oznaczonych jako zoptymalizowane pod kątem rozpraszania uwagi.

Testowanie implementacji

Aby sprawdzić, czy Twoja aplikacja spełnia wymagania dotyczące rozpraszania uwagi kierowcy, wykonaj te czynności:

  1. Zainstaluj aplikację w obrazie systemu bez Sklepu Google Play i trybu zgodności.
  2. Gdy siatka aplikacji uruchamiającej jest otwarta, symuluj jazdę i sprawdź, czy nie można otworzyć aplikacji.
  3. Przestań symulować jazdę, otwórz aplikację na ekranie odtwarzania i rozpocznij odtwarzanie.
  4. Ponownie symuluj jazdę i sprawdź, czy odtwarzanie się wstrzymuje.
    1. Jeśli Twoja aplikacja obsługuje integrację z MediaSession, użyj adb shell cmd media_session dispatch play i sprawdź, czy odtwarzanie się nie wznawia.

Optymalizowanie aplikacji pod kątem systemu operacyjnego Android Automotive

Aby zapewnić użytkownikom jak najlepsze wrażenia w samochodach, podczas tworzenia aplikacji na system operacyjny Android Automotive pamiętaj o tych kwestiach:

Praca z wcięciami okna i wycięciami wyświetlacza

Podobnie jak w przypadku innych formatów, system operacyjny Android Automotive zawiera elementy interfejsu systemu, takie jak paski stanu i nawigacji, oraz obsługuje wyświetlacze inne niż prostokątne.

Domyślnie aplikacje rysują w obszarze, który nie nakłada się na paski systemu ani wycięcia wyświetlacza. Możesz jednak chcieć, aby Twoja aplikacja ukrywała paski systemu, rysowała treści za nimi lub wyświetlała treści w wycięciu w ekranie, jak opisano w Układanie aplikacji w wcięciach okna. Jeśli Twoja aplikacja wykonuje którąś z tych czynności, zapoznaj się z tymi podsekcjami, aby dowiedzieć się, jak zapewnić jej prawidłowe działanie w ekosystemie urządzeń z systemem operacyjnym Android Automotive.

Paski systemu, tryb immersyjny i renderowanie od krawędzi do krawędzi

Paski systemu w samochodach mogą mieć inny rozmiar i położenie niż w przypadku innych formatów. Na przykład paski nawigacji mogą być umieszczone po lewej, prawej lub dolnej stronie ekranu. Nawet jeśli pasek stanu znajduje się u góry, a pasek nawigacji u dołu (jak w przypadku większości telefonów i tabletów), rozmiar tych elementów będzie prawdopodobnie znacznie większy w samochodach.

Ponadto system operacyjny Android Automotive umożliwia producentom OEM kontrolowanie, czy aplikacje mogą pokazywać lub ukrywać paski systemu, aby włączać i wyłączać tryb immersyjny mode. Na przykład uniemożliwiając aplikacjom ukrywanie pasków systemu, producenci OEM mogą zapewnić, że elementy sterujące pojazdu, takie jak elementy sterujące klimatyzacją, będą zawsze dostępne na ekranie. Jeśli producent OEM uniemożliwił aplikacjom kontrolowanie pasków systemu, nic się nie stanie, gdy aplikacja wywoła interfejsy API WindowInsetsController (lub WindowInsetsControllerCompat) , aby pokazać lub ukryć paski systemu. Więcej informacji o tym, jak wykryć, czy Twoja aplikacja mogła zmodyfikować wcięcia, znajdziesz w dokumentacji funkcji show i hide.

Podobnie producenci OEM mogą też kontrolować, czy aplikacje mogą ustawiać kolor i przezroczystość pasków systemu, aby zapewnić, że paski i elementy w nich zawarte będą zawsze dobrze widoczne. Jeśli Twoja aplikacja rysuje od krawędzi do krawędzi, sprawdź, czy za paskami systemu rysowane są tylko treści niekrytyczne. Te treści mogą być niewidoczne, jeśli producent OEM urządzenia uniemożliwi ustawienie koloru lub przezroczystości pasków.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

Jeśli Twoja aplikacja rysuje od krawędzi do krawędzi, nie zakładaj niczego na temat rozmiaru, liczby, typu ani lokalizacji pasków systemu. Zamiast tego użyj interfejsów API wcięć okna, aby ułożyć treści aplikacji względem pasków systemu. Więcej informacji o tym, jak korzystać z tych interfejsów API, znajdziesz w artykule Wyświetlanie treści od krawędzi do krawędzi w aplikacji. Wartości dopełnienia zakodowane na stałe nigdy nie są zalecane w przypadku żadnego formatu, ale w samochodach prawdopodobnie nie będą działać w ogóle, aby utrzymać treści w bezpiecznym obszarze.

Dostosowywanie się do wyświetlaczy o nieregularnym kształcie

Oprócz wyświetlaczy prostokątnych niektóre pojazdy mogą mieć ekrany o nieregularnym kształcie , jak pokazano na rysunku 1:

Urządzenie z systemem operacyjnym Android Automotive z wyświetlaczem zakrzywionym po prawej stronie.
Rysunek 1. Urządzenie z systemem operacyjnym Android Automotive z wyświetlaczem, który jest zakrzywiony po prawej stronie. Zielony obszar to bezpieczny prostokąt, który nie nakłada się na ramkę ograniczającą wycięcia w ekranie.

Jeśli Twoja aplikacja nie renderuje od krawędzi do krawędzi, nie musisz nic robić, aby renderować ją w bezpiecznym obszarze.

Jeśli Twoja aplikacja renderuje od krawędzi do krawędzi, możesz wybrać, jak ma się zachowywać w przypadku wycięć wyświetlacza. Możesz to zrobić za pomocą zasobów ustawiając android:windowLayoutInDisplayCutoutMode atrybut w motywie aplikacji lub w czasie działania modyfikując layoutInDisplayCutoutMode atrybut okna.

Ponieważ typy wycięć wyświetlacza występujące na urządzeniach z systemem operacyjnym Android Automotive różnią się od tych na urządzeniach mobilnych, nie używaj LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT ani LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, które mają zachowanie zoptymalizowane pod kątem wycięć występujących na urządzeniach mobilnych. Zamiast tego użyj LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER lub LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS , aby zawsze unikać wycięcia lub zawsze w nie wchodzić. Jeśli wybierzesz tę drugą opcję, zapoznaj się z artykułem Obsługa wycięć wyświetlacza, aby dowiedzieć się więcej o interfejsach API związanych z wycięciami wyświetlacza.

Jeśli Twoja aplikacja renderuje w obszarze wycięcia w ekranie i chcesz, aby zachowywała się inaczej w systemie operacyjnym Android Automotive niż na urządzeniach mobilnych, zapoznaj się z sekcją Wyłączanie funkcji, aby uzyskać wskazówki, jeśli Twoja aplikacja ustawia to zachowanie w czasie działania, oraz z sekcją Używanie alternatywnych zasobów, jeśli Twoja aplikacja ustawia to zachowanie za pomocą plików zasobów.

Wyłącz cechy

Jeśli udostępniasz dotychczasową aplikację mobilną w systemie operacyjnym Android Automotive, niektóre funkcje mogą być nieistotne lub niedostępne. Na przykład samochody zwykle nie zapewniają dostępu do kamer. Ponadto w systemie operacyjnym Android Automotive dostępny jest tylko a podzbiór Usług Google Play. Więcej informacji znajdziesz w artykule Usługi Google Play w samochodach.

Możesz użyć PackageManager.hasSystemFeature interfejsu API, aby wykryć, czy aplikacja działa w systemie operacyjnym Android Automotive, sprawdzając funkcję FEATURE_AUTOMOTIVE , jak pokazano w tym przykładzie:

val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
    // Enable or disable a given feature
}

Jeśli Twoja aplikacja ma też komponent Androida Auto, możesz użyć interfejsu API CarConnection z biblioteki aplikacji Android do samochodu, aby wykryć, czy aplikacja działa w systemie operacyjnym Android Automotive czy Androidzie Auto, lub czy w ogóle nie jest połączona z samochodem.

W przypadku trybu obraz w obrazie postępuj zgodnie z ustalonymi sprawdzonymi metodami, aby sprawdzić, czy funkcja jest dostępna, i odpowiednio zareagować.

Obsługa scenariuszy offline

Chociaż samochody są coraz częściej połączone z internetem, zalecamy, aby aplikacje obsługiwały działanie bez połączenia z internetem, np. w tych przypadkach:

  • Użytkownicy mogą zrezygnować z danych mobilnych oferowanych w ramach pakietu subskrypcji producenta samochodów.
  • Dostęp do danych mobilnych może być ograniczony w niektórych obszarach.
  • Samochody z radiem Wi-Fi mogą być poza zasięgiem Wi-Fi lub producent OEM może wyłączyć Wi-Fi na rzecz sieci komórkowej.

Przygotuj się na obsługę tych scenariuszy w swojej aplikacji, stopniowo ograniczając funkcje, które zależą od dostępu do internetu, np. przez oferowanie treści offline. Więcej informacji znajdziesz w artykule Sprawdzone metody optymalizacji sieci.

Używanie alternatywnych zasobów

Aby ułatwić dostosowanie aplikacji do samochodów, możesz użyć kwalifikatora zasobów car aby udostępniać alternatywne zasoby podczas działania w pojeździe z systemem operacyjnym Android Automotive. Jeśli na przykład używasz zasobów wymiarów do przechowywania wartości dopełnienia, możesz użyć większej wartości w przypadku zestawu zasobów car, aby powiększyć obszary docelowe dotyku.