System operacyjny Android Automotive umożliwia użytkownikom instalowanie aplikacji w samochodzie. Aby dotrzeć do użytkowników tej platformy, musisz rozpowszechniać aplikację zoptymalizowaną pod kątem kierowcy, zgodną z systemem operacyjnym Android Automotive. Możesz ponownie wykorzystać prawie cały kod i zasoby w aplikacji Android Auto, ale musisz utworzyć oddzielną kompilację, która spełnia wymagania podane na tej stronie.
Omówienie procesu tworzenia
Dodanie obsługi systemu operacyjnego Android Automotive wymaga wykonania kilku czynności opisanych w następnych sekcjach:
- Włącz funkcje samochodowe w Android Studio.
- Utwórz moduł dotyczący motoryzacji.
- Zaktualizuj zależności Gradle.
- Opcjonalnie wdróż ustawienia i aktywności logowania.
- Opcjonalnie przeczytaj wskazówki dotyczące hosta multimediów.
Uwagi dotyczące projektu
System operacyjny Android Automotive zajmuje się układem treści multimedialnych, które otrzymuje z usługi przeglądarki multimediów w aplikacji. Oznacza to, że aplikacja nie wyświetla interfejsu użytkownika ani nie uruchamia żadnych działań, gdy użytkownik odtwarza multimedia.
Jeśli wdrażasz ustawienia lub czynności logowania, muszą one być zoptymalizowane pod kątem pojazdu. Podczas projektowania tych obszarów aplikacji zapoznaj się ze wskazówkami dotyczącymi projektowania na potrzeby systemu operacyjnego Android Automotive.
Konfigurowanie projektu
Aby włączyć obsługę systemu operacyjnego Android Automotive, musisz skonfigurować kilka części projektu aplikacji.
Włączanie funkcji związanych z samochodami w Android Studio
Używaj Android Studio w wersji 4.0 lub nowszej, aby mieć pewność, że wszystkie funkcje Automotive OS są włączone.
Tworzenie modułu samochodowego
Niektóre komponenty systemu operacyjnego Android Automotive, takie jak plik manifestu, mają wymagania specyficzne dla platformy. Utwórz moduł, który pozwoli oddzielić kod tych komponentów od innego kodu w projekcie, np. kodu używanego w aplikacji na telefon.
Aby dodać moduł samochodowy do projektu:
- W Android Studio kliknij Plik > Nowy > Nowy moduł.
- Kliknij kolejno Moduł motoryzacyjny i Dalej.
- Wpisz nazwę aplikacji lub biblioteki. To nazwa, którą użytkownicy widzą w aplikacji w systemie operacyjnym Android Automotive.
- Wpisz nazwę modułu.
- Dostosuj nazwę pakietu tak, aby pasowała do Twojej aplikacji.
W sekcji Minimalny pakiet SDK wybierz API 28: Android 9.0 (Pie), a potem kliknij Dalej.
Wszystkie samochody obsługujące system operacyjny Android Automotive działają na Androidzie 9 (poziom interfejsu API 28) lub nowszym, więc wybór tej wartości spowoduje ukierunkowanie reklam na wszystkie zgodne samochody.
Wybierz Brak aktywności i kliknij Zakończ.
Po utworzeniu modułu w Android Studio otwórz AndroidManifest.xml
w nowym module samochodowym:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.media">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
<uses-feature
android:name="android.hardware.type.automotive"
android:required="true" />
</manifest>
Element application
zawiera standardowe informacje o aplikacji oraz element uses-feature
, który deklaruje obsługę systemu operacyjnego Android Automotive. Pamiętaj, że w pliku manifestu nie ma deklarowanych aktywności.
Jeśli wdrażasz ustawienia lub czynności związane z logowaniem, dodaj je tutaj. Te czynności są wywoływane przez system za pomocą jawnych intencji i są jedynymi czynnościami zadeklarowanymi w pliku manifestu aplikacji na system operacyjny Android Automotive.
Po dodaniu ustawień lub działań logowania uzupełnij plik manifestu, ustawiając atrybut android:appCategory="audio"
w elemencie application
i dodając te elementy uses-feature
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.media"> <application android:allowBackup="true" android:appCategory="audio" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" /> <uses-feature android:name="android.hardware.type.automotive" android:required="true" /> <uses-feature android:name="android.hardware.wifi" android:required="false" /> <uses-feature android:name="android.hardware.screen.portrait" android:required="false" /> <uses-feature android:name="android.hardware.screen.landscape" android:required="false" /> </manifest>
Wyraźne ustawienie tych funkcji na required="false"
zapewnia, że aplikacja nie będzie wchodzić w konflikt z dostępnymi funkcjami sprzętowymi w urządzeniach z systemem Automotive.
Deklarowanie obsługi multimediów w systemie operacyjnym Android Automotive
Aby zadeklarować, że aplikacja obsługuje system operacyjny Android Automotive, użyj tego wpisu w pliku manifestu:
<application>
...
<meta-data android:name="com.android.automotive"
android:resource="@xml/automotive_app_desc"/>
...
</application>
Ten wpis w pliku manifestu odnosi się do pliku XML, który deklaruje funkcje samochodowe obsługiwane przez aplikację.
Aby wskazać, że masz aplikację multimedialną, dodaj plik XML o nazwie automotive_app_desc.xml
do katalogu res/xml/
w projekcie. W tym pliku umieść te treści:
<automotiveApp>
<uses name="media"/>
</automotiveApp>
Filtry intencji
System operacyjny Android Automotive używa jawnych intencji do uruchamiania działań w aplikacji do multimediów. Nie dodawaj do pliku manifestu żadnych działań z filtrami intencji CATEGORY_LAUNCHER
lub ACTION_MAIN
.
Aktywności takie jak w tym przykładzie zwykle dotyczą telefonu lub innego urządzenia mobilnego. Deklaruj te czynności w module, który tworzy aplikację na telefon, a nie w module, który tworzy aplikację na system operacyjny Android Automotive.
<activity android:name=".MyActivity">
<intent-filter>
<!-- You can't use either of these intents for Android Automotive OS -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!--
In their place, you can include other intent filters for any activities
that your app needs for Android Automotive OS, such as settings or
sign-in activities.
-->
</intent-filter>
</activity>
Aktualizowanie zależności Gradle
Zalecamy, aby usługa przeglądarki multimedialnej była przechowywana w oddzielnym module, który jest wspólny dla aplikacji na telefon i modułu samochodowego. Jeśli używasz tego podejścia, musisz zaktualizować moduł samochodowy, aby uwzględniał moduł współdzielony, jak pokazano w tym fragmencie kodu:
Groovy
buildscript { ... dependencies { ... implementation project(':shared_module_name') } }
Kotlin
buildscript { ... dependencies { ... implementation(project(":shared_module_name")) } }
Wdrażanie ustawień i działań logowania
Oprócz usługi przeglądarki multimediów możesz też udostępniać optymalizowane pod kątem pojazdu ustawienia i działania logowania w przypadku aplikacji na system operacyjny Android Automotive. Te działania umożliwiają udostępnianie funkcji aplikacji, których nie ma w interfejsach API multimediów Androida.
Wykonuj te czynności tylko wtedy, gdy aplikacja na system operacyjny Android Automotive musi umożliwiać użytkownikom logowanie się lub ustawianie ustawień aplikacji. Te czynności nie są obsługiwane przez Androida Auto.
Przepływy pracy dotyczące aktywności
Ten diagram pokazuje, jak użytkownik wchodzi w interakcje z ustawieniami i aktywnościami logowania w systemie operacyjnym Android Automotive:
unikać rozpraszania uwagi podczas konfigurowania ustawień i logowania się.
Aby mieć pewność, że ustawienia lub czynności związane z logowaniem są dostępne tylko wtedy, gdy pojazd użytkownika jest zaparkowany, sprawdź, czy elementy <activity>
nie zawierają elementu <meta-data>
. Jeśli taki element się pojawi, aplikacja zostanie odrzucona podczas sprawdzania.
<!-- NOT ALLOWED -->
<meta-data
android:name="distractionOptimized"
android:value="true"/>
Dodawanie aktywności związanej z ustawieniami
Możesz dodać aktywność ustawień zoptymalizowaną pod kątem pojazdów, aby użytkownicy mogli konfigurować ustawienia aplikacji w samochodzie. Twoja aktywność związana z ustawieniami może też obejmować inne przepływy pracy, takie jak logowanie się na konto użytkownika lub wylogowywanie się z niego albo przełączanie kont użytkowników. Pamiętaj, że ta aktywność jest wywoływana tylko przez aplikację działającą w systemie operacyjnym Android Automotive. Aplikacje na telefonie połączone z Androidem Auto nie korzystają z tego interfejsu.
Deklarowanie aktywności ustawień
Aktywność ustawień musisz zadeklarować w pliku manifestu aplikacji, jak pokazano w tym fragmencie kodu:
<application>
...
<activity android:name=".AppSettingsActivity"
android:exported="true"
android:theme="@style/SettingsActivity"
android:label="@string/app_settings_activity_title">
<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
</intent-filter>
</activity>
...
</application>
Implementacja aktywności związanej z ustawieniami
Gdy użytkownik uruchomi aplikację, system operacyjny Android Automotive wykryje zadeklarowaną przez Ciebie aktywność ustawień i wyświetli element interfejsu, np. ikonę.
Użytkownik może kliknąć lub wybrać tę opcję na wyświetlaczu samochodu, aby przejść do aktywności. System operacyjny Android Automotive wysyła działanie ACTION_APPLICATION_PREFERENCES
, które informuje aplikację o konieczności uruchomienia aktywności ustawień.
W pozostałej części tej sekcji pokażemy, jak zastosować kod z przykładowej aplikacji Universal Android Music Player (UAMP) do implementacji aktywności ustawień w swojej aplikacji.
Na początek pobierz przykładowy kod:
# Clone the UAMP repositorygit clone https://github.com/android/uamp.git
# Fetch the appropriate pull request to your local repositorygit fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME
# Switch to the new branchgit checkout NEW_LOCAL_BRANCH_NAME
Aby wdrożyć aktywność, wykonaj te czynności:
- Skopiuj folder
automotive/automotive-lib
do modułu samochodowego. - Zdefiniuj drzewo preferencji, jak w
automotive/src/main/res/xml/preferences.xml
. Wprowadź
PreferenceFragmentCompat
, aby wyświetlić aktywność związaną z ustawieniami. Więcej informacji znajdziesz w plikachSettingsFragment.kt
iSettingsActivity.kt
w UAMP oraz w przewodniku Ustawienia Androida.
Podczas wdrażania aktywności ustawień zastosuj te sprawdzone metody dotyczące korzystania z niektórych komponentów w bibliotece preferencji:
- W ramach aktywności dotyczącej ustawień nie należy tworzyć więcej niż 2 poziomów głębokości poniżej widoku głównego.
- Nie używaj znaku
DropDownPreference
. Zamiast tego użyj kolumnyListPreference
. - Elementy organizacyjne:
PreferenceScreen
- Musi to być najwyższy poziom drzewa preferencji.
PreferenceCategory
- Służy do grupowania obiektów
Preference
. - Uwzględnij
title
.
- Służy do grupowania obiektów
- Uwzględnij elementy
key
ititle
we wszystkich tych komponentach. Możesz też dodać elementsummary
lubicon
albo oba te elementy:Preference
- Dostosuj logikę w wywołaniu zwrotnym
onPreferenceTreeClick()
w ramach implementacjiPreferenceFragmentCompat
.
- Dostosuj logikę w wywołaniu zwrotnym
CheckBoxPreference
- Zamiast
summary
może zawieraćsummaryOn
lubsummaryOff
.
- Zamiast
SwitchPreference
- Zamiast
summary
może zawieraćsummaryOn
lubsummaryOff
. - Może mieć wartość
switchTextOn
lubswitchTextOff
.
- Zamiast
SeekBarPreference
- Uwzględnij
min
,max
idefaultValue
.
- Uwzględnij
EditTextPreference
- Uwzględnij
dialogTitle
,positiveButtonText
inegativeButtonText
. - Może zawierać
dialogMessage
lubdialogLayoutResource
.
- Uwzględnij
com.example.android.uamp.automotive.lib.ListPreference
- Pochodzi głównie z
ListPreference
. - Służy do wyświetlania listy obiektów
Preference
z jednym wyborem. - Musi zawierać tablicę
entries
i odpowiadające jej wartościentryValues
.
- Pochodzi głównie z
com.example.android.uamp.automotive.lib.MultiSelectListPreference
- pochodzi głównie z
MultiSelectListPreference
, - Służy do wyświetlania listy obiektów
Preference
z kilkoma opcjami do wyboru. - Musi zawierać tablicę
entries
i odpowiadające jej wartościentryValues
.
- pochodzi głównie z
Dodawanie aktywności logowania
Jeśli aplikacja wymaga zalogowania się użytkownika, aby mógł z niej korzystać, możesz dodać optymalną dla pojazdu aktywność logowania, która obsługuje logowanie się i wylogowywanie z aplikacji. Możesz też dodać przepływy logowania i wylogowywania do aktywności ustawień, ale użyj dedykowanej aktywności logowania, jeśli aplikacji nie można używać, dopóki użytkownik się nie zaloguje. Pamiętaj, że ta aktywność jest wywoływana tylko przez aplikację działającą w systemie Android Automotive. Aplikacje na telefonie połączone z Androidem Auto nie korzystają z tej funkcji.
Wymagaj zalogowania się przy uruchamianiu aplikacji
Aby wymagać od użytkownika zalogowania się przed użyciem aplikacji, przeglądarka multimediów musi:
- W metodzie
onLoadChildren()
usługi wyślij wyniknull
za pomocą metodysendResult()
. - Ustaw wartość parametru
PlaybackStateCompat
naSTATE_ERROR
za pomocą metodysetState()
. Informuje to system operacyjny Android Automotive, że dopóki błąd nie zostanie naprawiony, nie można wykonywać innych operacji. - Ustaw kod błędu
PlaybackStateCompat
sesji multimediów naERROR_CODE_AUTHENTICATION_EXPIRED
. Informuje system operacyjny Android Automotive, że użytkownik musi się uwierzytelnić. - Ustaw komunikat o błędzie
PlaybackStateCompat
sesji multimediów za pomocą metodysetErrorMessage()
. Ten komunikat o błędzie jest widoczny dla użytkownika, dlatego należy go zlokalizować zgodnie z jego ustawieniami regionalnymi. Ustaw dodatkowe opcje
PlaybackStateCompat
sesji multimediów za pomocą metodysetExtras()
. Dodaj te 2 klucze:PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: ciąg znaków wyświetlany na przycisku, który uruchamia proces logowania. Ten ciąg tekstowy jest widoczny dla użytkownika, dlatego należy go zlokalizować zgodnie z jego bieżącymi ustawieniami języka.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
:PendingIntent
przekierowuje użytkownika do Twojej aktywności logowania, gdy użytkownik kliknie przycisk, do którego odwołuje się elementPLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
.
Ten fragment kodu pokazuje, jak aplikacja może wymagać od użytkownika zalogowania się przed jej użyciem:
Kotlin
import androidx.media.utils.MediaConstants val signInIntent = Intent(this, SignInActivity::class.java) val signInActivityPendingIntent = PendingIntent.getActivity(this, 0, signInIntent, 0) val extras = Bundle().apply { putString( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL, "Sign in" ) putParcelable( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT, signInActivityPendingIntent ) } val playbackState = PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f) .setErrorMessage( PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED, "Authentication required" ) .setExtras(extras) .build() mediaSession.setPlaybackState(playbackState)
Java
import androidx.media.utils.MediaConstants; Intent signInIntent = new Intent(this, SignInActivity.class); PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0, signInIntent, 0); Bundle extras = new Bundle(); extras.putString( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL, "Sign in"); extras.putParcelable( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT, signInActivityPendingIntent); PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f) .setErrorMessage( PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED, "Authentication required" ) .setExtras(extras) .build(); mediaSession.setPlaybackState(playbackState);
Po uwierzytelnieniu użytkownika ustaw PlaybackStateCompat
z powrotem na stan inny niż STATE_ERROR
, a następnie przekieruj użytkownika z powrotem do systemu Android Automotive, wywołując metodę finish()
aktywności.
Wdrażanie aktywności związanej z logowaniem
Google oferuje różne narzędzia do identyfikacji, które możesz wykorzystać, aby ułatwić użytkownikom logowanie się w aplikacji w samochodzie. Niektóre narzędzia, takie jak Uwierzytelnianie Firebase, udostępniają pełne zestawy narzędzi, które ułatwiają tworzenie niestandardowych metod uwierzytelniania. Inne narzędzia korzystają z dotychczasowych danych logowania użytkownika lub innych technologii, aby ułatwić użytkownikom płynne logowanie.
Te narzędzia mogą ułatwić logowanie się użytkownikom, którzy wcześniej zalogowali się na innym urządzeniu:
- Logowanie i rejestracja jednym dotknięciem: jeśli masz już wdrożoną funkcję logowania jednym dotknięciem na innych urządzeniach, np. w aplikacji na telefon, wdrożenie jej w aplikacji na system Android Automotive, aby obsługiwać dotychczasowych użytkowników logowania jednym dotknięciem.
- Logowanie w Google: jeśli masz już zaimplementowane logowanie w Google na innych urządzeniach, np. w aplikacji na telefonie, zaimplementuj logowanie w Google w aplikacji na system operacyjny Android Automotive, aby umożliwić korzystanie z tej funkcji użytkownikom.
- Autouzupełnianie z Google: jeśli użytkownicy korzystają z autouzupełniania z Google na innych urządzeniach z Androidem, ich dane logowania są zapisywane w Menedżerze haseł Google. Gdy użytkownicy logują się w aplikacji na system operacyjny Android Automotive, funkcja Autouzupełnianie w Google sugeruje odpowiednie zapisane dane logowania. Korzystanie z autouzupełniania z Google wymaga sporo pracy związanej z rozwojem aplikacji. Deweloperzy aplikacji mogą jednak optymalizować je pod kątem lepszej jakości wyników. Autouzupełnianie z Google jest obsługiwane na wszystkich urządzeniach z Androidem 8.0 (poziom interfejsu API 26) lub nowszym, w tym na systemie operacyjnym Android Automotive.
Korzystanie z usługi AccountManager
Aplikacje na system operacyjny Android Automotive, które wymagają uwierzytelniania, muszą używać interfejsu AccountManager z tych powodów:
- Lepsze wrażenia użytkowników i łatwe zarządzanie kontami: użytkownicy mogą łatwo zarządzać wszystkimi swoimi kontami w menu kont w ustawieniach systemu, w tym logować się i wylogowywać.
- „Tryb gościa”: samochody to urządzenia wspólne, co oznacza, że producenci OEM mogą włączyć w nich „tryb gościa”, w którym nie można dodawać kont. To ograniczenie jest osiągane za pomocą atrybutu
DISALLOW_MODIFY_ACCOUNTS
w przypadku atrybutuAccountManager
.
Uprawnienia
Jeśli chcesz poprosić użytkownika o przyznanie uprawnień, użyj tego samego procesu co w przypadku aktywności uwierzytelniania lub aktywności ustawień w diagramie przepływu aktywności pokazanym w poprzedniej sekcji.
Czytanie wskazówek dotyczących hostowania multimediów
W zależności od aplikacji systemowej (w tym jej wersji) łączącej się z Twoją usługą przeglądarki multimediów aplikacja może otrzymywać te dodatkowe informacje:
Obsługa błędów
Błędy w aplikacjach multimedialnych na system operacyjny Android Automotive są przekazywane za pomocą PlaybackStateCompat
sesji multimediów. W przypadku wszystkich błędów ustaw odpowiedni kod błędu i komunikat o błędzie w elementach PlaybackStateCompat
. W rezultacie w interfejsie pojawi się Toast
.
Jeśli wystąpi błąd, ale odtwarzanie może być kontynuowane, wygeneruj niekrytyczny błąd. Na przykład użytkownik może odtwarzać muzykę w aplikacji przed zalogowaniem się, ale musi się zalogować, aby móc pominąć utwór. Gdy używasz błędu niekrytycznego, system może zasugerować użytkownikowi zalogowanie się bez przerywania odtwarzania bieżącego elementu multimedialnego.
W przypadku błędu niekrytycznego zachowaj pozostałą część pliku PlaybackStateCompat
w postaci niezmienionej (z wyjątkiem kodu błędu i komunikatu o błędzie). Dzięki temu odtwarzanie bieżącego elementu multimedialnego będzie kontynuowane, gdy użytkownik zdecyduje się zalogować.
Gdy odtwarzanie nie jest możliwe, na przykład gdy nie ma połączenia z internetem lub treści offline, ustaw stan PlaybackStateCompat
na STATE_ERROR
.
Podczas kolejnych aktualizacji PlaybackStateCompat
usuń wszystkie kody błędów i komunikaty o błędach, aby uniknąć wyświetlania wielu ostrzeżeń dotyczących tego samego błędu.
Jeśli w jakimś momencie nie możesz załadować drzewa przeglądania (na przykład, gdy wymagasz uwierzytelniania, a użytkownik nie jest zalogowany), prześlij puste drzewo przeglądania. Aby to zasygnalizować, zwracaj wartość null z parametru onLoadChildren()
dla wierzchołka źródeł multimediów. W takim przypadku system wyświetla pełny ekran błędu z komunikatem o błędzie ustawionym w PlaybackStateCompat
.
Błędy, które można naprawić
Jeśli błąd można naprawić, dodatkowo w polu PlaybackStateCompat
ustaw te 2 opcje dodatkowe:
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: etykieta przycisku, który należy kliknąć, aby rozwiązać błąd. Ten ciąg znaków jest widoczny dla użytkownika, dlatego należy go zlokalizować zgodnie z jego bieżącymi ustawieniami regionalnymi.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
:PendingIntent
, który przycisk uruchamia w celu rozwiązania błędu, na przykład przez uruchomienie aktywności logowania.
Błędy wymagające działania są oznaczone ikoną Dialog
i mogą zostać rozwiązane przez użytkowników tylko wtedy, gdy samochód jest zatrzymany.
Testowanie przypadków błędów
Sprawdź, czy aplikacja prawidłowo obsługuje błędy we wszystkich scenariuszach, w tym:
- Różne poziomy produktu: na przykład wersja bezpłatna i premium lub zalogowana i niezalogowana.
- Różne stany jazdy: na przykład parkowanie i jazda.
- Różne stany połączenia: na przykład online lub offline.
Inne rzeczy, które warto wziąć pod uwagę
Podczas tworzenia aplikacji na Androida Automotive weź pod uwagę te kwestie:
Treści offline
W razie potrzeby wdrożyć obsługę odtwarzania offline. Samochody z systemem operacyjnym Android Automotive powinny mieć własne połączenie z internetem, co oznacza, że pakiet danych jest uwzględniony w cenie pojazdu lub płatny przez użytkownika. Samochody powinny jednak mieć bardziej zmienne połączenie niż urządzenia mobilne.
Oto kilka kwestii, o których warto pamiętać, gdy rozważasz strategię pomocy offline:
- Najlepszym momentem na pobranie treści jest czas, gdy aplikacja jest używana.
- Nie zakładaj, że sieć Wi-Fi jest dostępna. Samochód może nigdy nie znaleźć się w zasięgu sieci Wi-Fi lub producent OEM może wyłączyć Wi-Fi na rzecz sieci komórkowej.
- Chociaż można inteligentnie przechowywać w pamięci podręcznej treści, których oczekują użytkownicy, zalecamy umożliwienie użytkownikom zmiany tego zachowania za pomocą aktywności w ustawieniach.
- Pamięć na dysku w samochodach jest różna, dlatego daj użytkownikom możliwość usuwania treści offline, np. za pomocą opcji w aktywności ustawień.
Obsługa WebView
Interfejsy WebView są obsługiwane w systemie operacyjnym Android Automotive, ale są dozwolone tylko w przypadku ustawień i działań związanych z logowaniem. Aktywności, które korzystają z WebView, muszą mieć opcję „zamknij” lub „wstecz” poza WebView.
Oto kilka przykładów akceptowanych zastosowań WebView:
- wyświetlanie polityki prywatności, warunków korzystania z usługi lub innych linków związanych z prawem w ramach aktywności w ustawieniach.
- Proces logowania się w witrynie.
Podczas korzystania z WebView możesz włączyć JavaScript.
Zabezpieczanie WebView
Podejmij wszelkie możliwe środki ostrożności, aby komponent WebView nie był punktem wejścia do internetu. Poniżej znajdziesz fragment kodu, który pokazuje, jak zablokować WebView na adres URL użyty w wywołaniu loadUrl()
i zapobiec przekierowaniom. Zdecydowanie zalecamy stosowanie takich zabezpieczeń, gdy jest to możliwe, np. podczas wyświetlania linków związanych z prawem.
Kotlin
override fun shouldOverrideUrlLoading(webView: WebView, webResourceRequest: WebResourceRequest): Boolean { val originalUri: Uri = Uri.parse(webView.originalUrl) // Check for allowed URLs if (originalUri.equals(Uri.parse(BLANK_URL)) || originalUri.equals(webResourceRequest.url)) { return false } if (webResourceRequest.isRedirect) { logger.w("Redirect detected, not following") return true } setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url) logger.w( String.format( "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri)) return true }
Java
@Override public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) { Uri originalUri = Uri.parse(webView.getOriginalUrl()); // Check for allowed URLs if (originalUri.equals(Uri.parse(BLANK_URL)) || originalUri.equals(webResourceRequest.getUrl())) { return false; } if (webResourceRequest.isRedirect()) { logger.w("Redirect detected, not following"); return true; } setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl()); logger.w( String.format( "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri)); return true; }
nazwy pakietów,
Ponieważ dystrybuujesz osobny pakiet Android Application Package Kit (APK) dla systemu operacyjnego Android Automotive, możesz ponownie użyć nazwy pakietu z aplikacji mobilnej lub utworzyć nową nazwę pakietu. Jeśli używasz innej nazwy pakietu, Twoja aplikacja ma 2 osobne strony w Google Play. Jeśli ponownie użyjesz obecnej nazwy pakietu, Twoja aplikacja będzie mieć jedną stronę na obu platformach.
Jest to przede wszystkim decyzja biznesowa. Jeśli na przykład jeden zespół pracuje nad aplikacją mobilną, a inny nad aplikacją na system Android Automotive, warto użyć oddzielnych nazw pakietów i zezwolić każdemu zespołowi na zarządzanie własną stroną w Sklepie Play. Nie ma dużej różnicy w nakładzie pracy technicznej wymaganej do zastosowania obu tych metod.
W tabeli poniżej zestawiono inne kluczowe różnice między zachowaniem obecnej nazwy pakietu a użyciem nowej nazwy pakietu:
Funkcja | ta sama nazwa pakietu, | Nazwa nowego pakietu |
---|---|---|
Informacje o aplikacji | Pojedynczy | Wiele |
Instalacja lustrzana | Tak: „Szybka instalacja aplikacji” w kreatorze | Nie |
Proces sprawdzania w Sklepie Play | Blokowanie weryfikacji: jeśli weryfikacja jednego pliku APK zakończy się niepowodzeniem, inne pliki APK przesłane w ramach tej samej wersji zostaną zablokowane. | Indywidualne opinie |
Statystyki, dane i wskaźniki | Włączone: możesz filtrować dane dotyczące motoryzacji. | Rozdziel |
Indeksowanie i ranking wyszukiwania | Budowanie na podstawie obecnej pozycji | Brak przeniesienia |
Integracja z innymi aplikacjami | Najprawdopodobniej nie trzeba wprowadzać żadnych zmian, o ile kod multimediów jest wspólny dla obu plików APK. | Może być konieczne zaktualizowanie odpowiedniej aplikacji, na przykład w celu odtwarzania URI za pomocą Asystenta Google. |
Najczęstsze pytania
W następnych sekcjach znajdziesz odpowiedzi na niektóre z najczęstszych pytań dotyczących systemu operacyjnego Android Automotive.
Sprzęt
Czy moja aplikacja może uzyskać dostęp do mikrofonu
W przypadku aplikacji kierowanych na Androida 10 (poziom API 29) lub nowszego zapoznaj się z dokumentacją dotyczącą udostępniania danych wejściowych audio. Nie jest to możliwe w przypadku poziomu interfejsu API 28.
Do których interfejsów API samochodów możemy uzyskać dostęp i w jaki sposób?
Możesz korzystać tylko z interfejsów API udostępnionych przez producenta OEM. Opracowujemy procesy, które pozwolą Ci ujednolicić sposób uzyskiwania dostępu do tych interfejsów API.
Aplikacje mogą uzyskiwać dostęp do interfejsów API samochodów za pomocą SetProperty()
i GetProperty()
w CarPropertyManager
.
Aby zobaczyć listę wszystkich dostępnych usług, zapoznaj się z kodem źródłowym lub dokumentacją referencyjną. Jeśli właściwość jest oznaczona symbolem @SystemApi
, jest ograniczona do wstępnie załadowanych aplikacji systemowych.
Jakie typy kodeków audio są obsługiwane?
Zapoznaj się ze szczegółami dotyczącymi kodeka audio w dokumentacji CDD na Androida.
Czy obsługiwany jest DRM Widevine?
Tak. Obsługiwany jest DRM Widevine.
Programowanie i testowanie
Czy istnieją jakieś ograniczenia lub zalecenia dotyczące używania zewnętrznych pakietów SDK i bibliotek?
Nie mamy żadnych konkretnych wytycznych dotyczących używania zewnętrznych pakietów SDK i bibliotek. Jeśli zdecydujesz się używać pakietów SDK i bibliotek innych firm, nadal będziesz odpowiadać za zgodność z wymaganiami dotyczącymi jakości aplikacji samochodowych.
Czy mogę używać usługi na pierwszym planie?
Jedynym dozwolonym przypadkiem użycia usługi na pierwszym planie jest pobieranie treści do użytku offline. Jeśli masz inny przypadek użycia usługi na pierwszym planie, którego chcesz się dowiedzieć, skontaktuj się z nami za pomocą grupy dyskusyjnej Android Automotive OS.
Publikowanie aplikacji na system operacyjny Android Automotive
Jak opublikować aplikację na system operacyjny Android Automotive za pomocą Konsoli Google Play?
Szczegółowe informacje o publikowaniu aplikacji na system operacyjny Android Automotive za pomocą Konsoli Play znajdziesz w artykule Rozpowszechnianie aplikacji na samochody.
Dodatkowe materiały
Więcej informacji o systemie operacyjnym Android Automotive znajdziesz w tych dodatkowych materiałach.
Próbki
Przewodniki
- Projektowanie pod kątem jazdy
- Korzystanie z aplikacji testowej sterownika multimediów
- Powiadomienia w systemie operacyjnym Android Automotive
- Jakość aplikacji samochodowych na Androida
Blogi
- Aktualizacje systemu operacyjnego Android Automotive dla deweloperów
- Tworzenie aplikacji na system operacyjny Android Automotive
Filmy
- Jak tworzyć aplikacje multimedialne do samochodów (Android Dev Summit '19)
- Jak tworzyć aplikacje na Androida na potrzeby samochodów (Google I/O'19)
Zgłaszanie problemów z multimediami w systemie operacyjnym Android Automotive
Jeśli podczas tworzenia aplikacji do multimediów na Androida Automotive napotkasz problem, możesz go zgłosić za pomocą Google Issue Tracker. Pamiętaj, aby podać wszystkie wymagane informacje w szablonie zgłoszenia.
Zanim zgłosisz nowy problem, sprawdź, czy nie został już zgłoszony na liście problemów. Możesz subskrybować problemy i głosować na nie, klikając gwiazdkę obok problemu w śledzącym. Więcej informacji znajdziesz w artykule Subskrybowanie problemu.