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:
- Ekrany systemów multimedialnych mają stałą orientację. Aby spełniać wymagania dotyczące jakości aplikacji samochodowych, aplikacje muszą obsługiwać orientację pionową i poziomą.
- Interfejsy API dostępne na innych urządzeniach mogą nie być dostępne w systemie operacyjnym Android Automotive OS. Na przykład niektóre interfejsy API Usług Google Play nie są dostępne w systemie operacyjnym Android Automotive. Więcej informacji o tym, jak rozwiązywać te problemy, znajdziesz w sekcji Wyłączanie funkcji.
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:
- W przypadku aplikacji wideo zapoznaj się z artykułem Oznaczanie aplikacji jako aplikacji wideo.
- W przypadku gier zapoznaj się z artykułem Oznaczanie aplikacji jako gry.
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:
- Zainstaluj aplikację w obrazie systemu bez Sklepu Google Play i trybu zgodności.
- Gdy siatka aplikacji uruchamiającej jest otwarta, symuluj jazdę i sprawdź, czy nie można otworzyć aplikacji.
- Przestań symulować jazdę, otwórz aplikację na ekranie odtwarzania i rozpocznij odtwarzanie.
- Ponownie symuluj jazdę i sprawdź, czy odtwarzanie się wstrzymuje.
- Jeśli Twoja aplikacja obsługuje integrację z
MediaSession, użyjadb shell cmd media_session dispatch playi sprawdź, czy odtwarzanie się nie wznawia.
- Jeśli Twoja aplikacja obsługuje integrację z
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:
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.