Android Automotive OS consente agli utenti di installare app nell'auto. Per raggiungere gli utenti su questa piattaforma, devi distribuire un'app ottimizzata per il conducente compatibile con Android Automotive OS. Puoi riutilizzare quasi tutto il codice e le risorse nella tua app Android Auto, ma devi creare una build separata che soddisfi i requisiti indicati in questa pagina.
Panoramica dello sviluppo
L'aggiunta del supporto di Android Automotive OS richiede solo pochi passaggi, come descritto nelle sezioni seguenti:
- Attiva le funzionalità per il settore automobilistico in Android Studio.
- Crea un modulo per il settore automobilistico.
- Aggiorna le dipendenze di Gradle.
- (Facoltativo) Implementa le impostazioni e le attività di accesso.
- (Facoltativo) Leggi i suggerimenti per gli host multimediali.
Note sul layout
Android Automotive OS si occupa del layout dei contenuti multimediali che riceve dal servizio di esplorazione multimediale della tua app. Ciò significa che la tua app non disegna la UI e non avvia nessuna delle tue attività quando un utente attiva la riproduzione dei contenuti multimediali.
Se implementi impostazioni o attività di accesso, queste attività devono essere ottimizzate per il veicolo. Consulta le linee guida per la progettazione per Android Automotive OS durante la progettazione di queste aree dell'app.
Configura il progetto
Per abilitare il supporto per Android Automotive OS, devi configurare diverse parti del progetto della tua app.
Attivare le funzionalità per il settore automobilistico in Android Studio
Utilizza Android Studio 4.0 o versioni successive per assicurarti che tutte le funzionalità di Automotive OS siano attive.
Crea un modulo automobilistico
Alcuni componenti di Android Automotive OS, come il manifest, hanno requisiti specifici della piattaforma. Crea un modulo che possa mantenere il codice di questi componenti separato da altro codice nel tuo progetto, ad esempio il codice utilizzato per l'app per smartphone.
Per aggiungere un modulo per il settore automobilistico al tuo progetto:
- In Android Studio, fai clic su File > Nuovo > Nuovo modulo.
- Seleziona Modulo per il settore automobilistico e poi fai clic su Avanti.
- Inserisci un nome applicazione/libreria. Questo è il nome che gli utenti vedono per la tua app su Android Automotive OS.
- Inserisci un Nome modulo.
- Modifica il nome del pacchetto in modo che corrisponda alla tua app.
Seleziona API 28: Android 9.0 (Pie) per l'SDK minima e poi fai clic su Avanti.
Tutte le auto che supportano Android Automotive OS eseguono Android 9 (livello API 28) o versioni successive, quindi la selezione di questo valore ha come target tutte le auto compatibili.
Seleziona Nessuna attività e poi fai clic su Fine.
Dopo aver creato il modulo in Android Studio, apri AndroidManifest.xml nel nuovo modulo per auto:
<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>
L'elemento <application> contiene alcune informazioni standard sull'app, nonché un elemento
<uses-feature> che dichiara il supporto di Android Automotive OS.
Tieni presente che nel manifest non sono dichiarate attività.
Se implementi impostazioni o attività di accesso, aggiungile qui. Queste attività vengono attivate dal sistema utilizzando intent espliciti e sono le uniche attività che dichiari nel manifest per la tua app per Android Automotive OS.
Dopo aver aggiunto impostazioni o attività di accesso, completa il file manifest impostando l'attributo android:appCategory dell'elemento <application> su "audio".
<application
...
android:appCategory="audio" />
Dichiarare i requisiti delle funzionalità
Tutte le app create per Android Automotive OS devono soddisfare determinati requisiti per essere distribuite utilizzando Google Play. Per saperne di più, consulta Requisiti delle funzionalità di Google Play.
Dichiarare il supporto dei contenuti multimediali per Android Automotive OS
Utilizza la seguente voce del manifest per dichiarare che la tua app supporta Android Automotive OS:
<application>
...
<meta-data android:name="com.android.automotive"
android:resource="@xml/automotive_app_desc"/>
...
</application>
Questa voce del manifest fa riferimento a un file XML che dichiara le funzionalità per le auto supportate dalla tua app.
Per indicare che hai un'app multimediale, aggiungi un file XML denominato automotive_app_desc.xml alla directory res/xml/ nel tuo progetto. Includi i seguenti contenuti in questo file:
<automotiveApp>
<uses name="media"/>
</automotiveApp>
Filtri per intent
Android Automotive OS utilizza intent espliciti per attivare le attività nella tua app multimediale. Non includere attività con filtri per intent CATEGORY_LAUNCHER o ACTION_MAIN nel file manifest.
Attività come quella nell'esempio seguente di solito hanno come target un telefono o un altro dispositivo mobile. Dichiara queste attività nel modulo che crea l'app per smartphone, non nel modulo che crea l'app per Android Automotive OS.
<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>
Aggiornare le dipendenze di Gradle
Ti consigliamo di mantenere il servizio di esplorazione dei contenuti multimediali in un modulo separato che condividi tra l'app per smartphone e il modulo per l'auto. Se utilizzi questo approccio, devi aggiornare il modulo automotive per includere il modulo condiviso, come mostrato nel seguente snippet:
my-auto-module/build.gradle
Alla moda
buildscript { ... dependencies { ... implementation project(':shared_module_name') } }
Kotlin
buildscript { ... dependencies { ... implementation(project(":shared_module_name")) } }
Implementare le impostazioni e le attività di accesso
Oltre al servizio di navigazione multimediale, puoi anche fornire impostazioni e attività di accesso ottimizzate per il veicolo per la tua app Android Automotive OS. Queste attività ti consentono di fornire funzionalità dell'app non incluse nelle API Android Media.
Implementa queste attività solo se la tua app Android Automotive OS deve consentire agli utenti di accedere o specificare le impostazioni dell'app. Queste attività non vengono utilizzate da Android Auto.
Flussi di lavoro delle attività
Il seguente diagramma mostra come un utente interagisce con le impostazioni e le attività di accesso utilizzando Android Automotive OS:
Figura 1. Flussi di lavoro per le impostazioni e l'attività di accesso.
Ridurre le distrazioni nelle impostazioni e nelle attività di accesso
Per assicurarti che le impostazioni e le attività di accesso siano disponibili solo per l'uso
mentre il veicolo dell'utente è parcheggiato, verifica che gli elementi <activity>
non includano l'elemento <meta-data>. La tua app verrà rifiutata
durante la revisione se è presente un elemento di questo tipo.
<!-- NOT ALLOWED -->
<meta-data
android:name="distractionOptimized"
android:value="true"/>
Aggiungere un'attività di impostazioni
Puoi aggiungere un'attività di impostazioni ottimizzate per il veicolo in modo che gli utenti possano configurare le impostazioni della tua app nella loro auto. L'attività delle impostazioni può fornire anche altri flussi di lavoro, ad esempio l'accesso o la disconnessione dall'account di un utente o il cambio di account utente. Ricorda che questa attività viene attivata solo da un'app in esecuzione su Android Automotive OS. Le app per smartphone connesse ad Android Auto non lo utilizzano.
Dichiarare un'attività di impostazioni
Devi dichiarare l'attività delle impostazioni nel file manifest dell'app, come mostrato nello snippet di codice seguente:
<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>
Implementare l'attività delle impostazioni
Quando un utente avvia la tua app, Android Automotive OS rileva l'attività
delle impostazioni che hai dichiarato e mostra un elemento di interazione, ad esempio un'icona.
L'utente può toccare o selezionare questa funzionalità utilizzando il display dell'auto per navigare
fino all'attività. Android Automotive OS invia l'intent
ACTION_APPLICATION_PREFERENCES che indica alla tua app di avviare
l'attività delle impostazioni.
Il resto di questa sezione mostra come adattare il codice dell'app di esempio Universal Android Music Player (UAMP) per implementare un'attività di impostazioni per la tua app.
Per iniziare, scarica il codice campione:
# 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
Per implementare l'attività, segui questi passaggi:
- Copia la cartella
automotive/automotive-libnel modulo automobilistico. - Definisci una struttura delle preferenze come in
automotive/src/main/res/xml/preferences.xml. Implementa un
PreferenceFragmentCompatche viene visualizzato nell'attività delle impostazioni. Per saperne di più, consulta i fileSettingsFragment.kteSettingsActivity.ktin UAMP e la Guida alle impostazioni di Android.
Quando implementi l'attività delle impostazioni, considera queste best practice per l'utilizzo di alcuni componenti della libreria delle preferenze:
- Non avere più di due livelli di profondità sotto la visualizzazione principale nell'attività delle impostazioni.
- Non utilizzare un
DropDownPreference. Utilizza invece unListPreference. - Componenti organizzativi:
PreferenceScreen- Deve essere il livello superiore dell'albero delle preferenze.
PreferenceCategory- Utilizzato per raggruppare gli oggetti
Preference. - Includi un
title.
- Utilizzato per raggruppare gli oggetti
- Includi un
keye untitlein tutti i seguenti componenti. Puoi anche includere unsummary, unicono entrambi:Preference- Personalizza la logica nel callback
onPreferenceTreeClick()dell'implementazione diPreferenceFragmentCompat.
- Personalizza la logica nel callback
CheckBoxPreference- Può avere
summaryOnosummaryOffanzichésummaryper il testo condizionale.
- Può avere
SwitchPreference- Può avere
summaryOnosummaryOffanzichésummaryper il testo condizionale. - Può avere
switchTextOnoswitchTextOff.
- Può avere
SeekBarPreference- Includi
min,maxedefaultValue.
- Includi
EditTextPreference- Includi
dialogTitle,positiveButtonTextenegativeButtonText. - Può avere uno o entrambi i valori
dialogMessageedialogLayoutResource.
- Includi
com.example.android.uamp.automotive.lib.ListPreference- Deriva principalmente da
ListPreference. - Utilizzato per visualizzare un elenco a scelta singola di oggetti
Preference. - Deve contenere un array di
entrieseentryValuescorrispondenti.
- Deriva principalmente da
com.example.android.uamp.automotive.lib.MultiSelectListPreference- Deriva principalmente da
MultiSelectListPreference - Utilizzato per visualizzare un elenco a scelta multipla di oggetti
Preference. - Deve contenere un array di
entrieseentryValuescorrispondenti.
- Deriva principalmente da
Aggiungere un'attività di accesso
Se la tua app richiede l'accesso prima di poter essere utilizzata, puoi aggiungere un'attività di accesso ottimizzata per il veicolo che gestisce l'accesso e la disconnessione dall'app. Puoi anche aggiungere flussi di lavoro di accesso e disconnessione a un'attività di impostazioni, ma utilizza un'attività di accesso dedicata se la tua app non può essere utilizzata finché un utente non esegue l'accesso. Ricorda che questa attività viene attivata solo da un'app in esecuzione su Android Automotive OS. Le app per smartphone connesse ad Android Auto non lo utilizzano.
Richiedi l'accesso all'avvio dell'app
Per richiedere a un utente di accedere prima di poter utilizzare la tua app, il servizio di esplorazione dei contenuti multimediali deve eseguire le seguenti operazioni:
- Nel metodo
onLoadChildren()del servizio, invia il risultatonullutilizzando il metodosendResult(). - Imposta
PlaybackStateCompatdella sessione multimediale suSTATE_ERRORutilizzando il metodosetState(). In questo modo, Android Automotive OS sa che non è possibile eseguire altre operazioni finché l'errore non è stato risolto. - Imposta il codice di errore
PlaybackStateCompatdella sessione media suERROR_CODE_AUTHENTICATION_EXPIRED. In questo modo, Android Automotive OS sa che l'utente deve autenticarsi. - Imposta il messaggio di errore
PlaybackStateCompatdella sessione multimediale utilizzando il metodosetErrorMessage(). Poiché questo messaggio di errore è rivolto all'utente, localizzalo per le impostazioni internazionali correnti dell'utente. Imposta gli extra
PlaybackStateCompatdella sessione multimediale utilizzando il metodosetExtras(). Includi le seguenti due o tre chiavi:PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL: una stringa visualizzata sul pulsante che avvia il flusso di lavoro di accesso. Poiché questa stringa è visibile agli utenti, localizzala per le impostazioni locali correnti dell'utente.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT: unPendingIntentche indirizza l'utente alla tua attività di accesso quando tocca il pulsante a cui fa riferimentoPLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_USING_CAR_APP_LIBRARY_INTENT: unPendingIntentche indirizza l'utente all'attività di accesso alla libreria di app per auto. Poiché l'host della libreria di app per auto è ottimizzato per la guida, l'intent ignora automaticamente la schermata di risoluzione degli errori e mostra immediatamente la schermata di accesso. Se imposti questo extra, imposta anche i due precedenti per garantire la compatibilità con i veicoli più vecchi.
Il seguente snippet di codice mostra come la tua app può richiedere all'utente di accedere prima di utilizzare l'app:
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);
Una volta autenticato correttamente l'utente, imposta PlaybackStateCompat
su uno stato diverso da STATE_ERROR,
quindi riporta l'utente ad Android Automotive OS chiamando il metodo
finish()
dell'attività.
Implementare l'attività di accesso
Google offre una serie di strumenti di identità che puoi utilizzare per aiutare gli utenti ad accedere alla tua app nelle loro auto. Alcuni strumenti, come Firebase Authentication, forniscono toolkit full-stack che possono aiutarti a creare esperienze di autenticazione personalizzate. Altri strumenti sfruttano le credenziali esistenti di un utente o altre tecnologie per aiutarti a creare esperienze di accesso senza interruzioni per gli utenti.
I seguenti strumenti possono aiutarti a creare un'esperienza di accesso più semplice per gli utenti che hanno già eseguito l'accesso su un altro dispositivo:
- Accesso e registrazione One Tap:se hai già implementato One Tap per altri dispositivi, ad esempio l'app per smartphone, implementalo per la tua app Android Automotive OS per supportare gli utenti One Tap esistenti.
- Accedi con Google:se hai già implementato Accedi con Google per altri dispositivi, ad esempio l'app per smartphone, implementa Accedi con Google per la tua app Android Automotive OS in modo da supportare gli utenti esistenti di Accedi con Google.
- Compilazione automatica Google:se gli utenti hanno attivato la compilazione automatica Google sugli altri dispositivi Android, le loro credenziali vengono salvate nel Gestore delle password di Google. Quando questi utenti accedono alla tua app Android Automotive OS, Compilazione automatica con Google suggerisce le credenziali pertinenti salvate. L'utilizzo della Compilazione automatica Google non richiede alcuno sforzo di sviluppo dell'applicazione. Tuttavia, gli sviluppatori di applicazioni possono ottimizzare le proprie app per ottenere risultati di qualità migliore. La compilazione automatica Google è supportata da tutti i dispositivi con Android 8.0 (livello API 26) o versioni successive, incluso Android Automotive OS.
Utilizza AccountManager
Le app per Android Automotive OS che prevedono l'autenticazione devono utilizzare
AccountManager per i seguenti motivi:
- Migliore esperienza utente e facilità di gestione dell'account:gli utenti possono gestire tutti i loro account dal menu degli account nelle impostazioni di sistema, inclusi l'accesso e la disconnessione.
- Esperienze"Ospite":le auto sono dispositivi condivisi, il che significa che gli OEM possono attivare
esperienze "Ospite" nel veicolo, in cui non è possibile aggiungere account. Questa
limitazione viene ottenuta utilizzando
DISALLOW_MODIFY_ACCOUNTSperAccountManager.
Autorizzazioni
Se devi richiedere le autorizzazioni all'utente, utilizza lo stesso flusso dell'attività di autenticazione o dell'attività delle impostazioni nel diagramma dei flussi di lavoro delle attività mostrato in una sezione precedente.
Implementare la disconnessione
Indipendentemente dal modo in cui hai scelto di implementare l'accesso, quando l'utente esce, devi chiamare MediaBrowserServiceCompat#notifyChildrenChanged(rootId) per invalidare l'albero di navigazione in modo che l'app host multimediale cancelli tutte le informazioni relative all'utente (ad esempio l'ultima query di ricerca).
Avvia l'app host multimediale
Puoi creare intent per aprire l'app host multimediale nella tua app o nei tuoi contenuti all'interno della tua app. Ad esempio:
- La tua app può pubblicare una notifica con un pending intent che consente a un utente di aprire l'app per ascoltare un nuovo contenuto.
- La tua app può gestire i link diretti e aprire l'app host nella visualizzazione più appropriata.
Determinare le funzionalità dell'host dei contenuti multimediali
Le versioni dell'app host multimediale supportano funzionalità diverse. Gli host indicano il supporto per diverse funzionalità includendo filtri per i seguenti intent:
Tutte le app host multimediali supportano gli intent MEDIA_TEMPLATE. Per determinare se l'host multimediale supporta gli intent MEDIA_TEMPLATE_V2, puoi utilizzare queryIntentActivities() nel seguente modo:
val isMediaTemplateV2Supported = packageManager.queryIntentActivities(
Intent(MediaIntentExtras.ACTION_MEDIA_TEMPLATE_V2),
// MATCH_DEFAULT_ONLY since the host should be started with implicit intents
// MATCH_SYSTEM_ONLY excludes any apps that aren't preinstalled
PackageManager.MATCH_DEFAULT_ONLY or PackageManager.MATCH_SYSTEM_ONLY
).size > 0
Creare e utilizzare un intent
A seconda delle azioni di intent supportate dall'host multimediale e del tuo caso d'uso specifico, puoi fornire i seguenti extra durante la creazione dell'intent che utilizzi per avviare l'app host multimediale.
| Chiave aggiuntiva | Tipo | Descrizione | Azioni supportate |
|---|---|---|---|
EXTRA_KEY_MEDIA_COMPONENT |
String |
Il nome del componente compresso di MediaBrowserService a cui deve connettersi l'app host multimediale, in genere quella della tua app. Se questo extra non è specificato, l'host multimediale utilizza per impostazione predefinita l'origine multimediale attiva. |
MEDIA_TEMPLATE, MEDIA_TEMPLATE_V2 |
EXTRA_KEY_SEARCH_QUERY |
String |
La query di ricerca da utilizzare durante la chiamata | MEDIA_TEMPLATE, MEDIA_TEMPLATE_V2 |
EXTRA_KEY_MEDIA_ID |
String |
L'ID del contenuto multimediale da aprire nella visualizzazione Sfoglia. | MEDIA_TEMPLATE_V2 |
EXTRA_KEY_SEARCH_ACTION |
Integer |
L'azione da intraprendere al termine della ricerca di EXTRA_KEY_SEARCH_QUERY. |
MEDIA_TEMPLATE_V2 |
Ad esempio, con un host che supporta le azioni MEDIA_TEMPLATE_V2, il
seguente codice aprirà l'app host multimediale, la connetterà a
MyMediaBrowserService, eseguirà una ricerca di "Jazz" e riprodurrà il primo
elemento dei risultati di ricerca. Su tutti gli altri host, aprirà solo l'app host multimediale ed eseguirà una ricerca di "Jazz", lasciando all'utente la possibilità di selezionare un elemento da riprodurre dai risultati.
val startMediaHostIntent = Intent(ACTION_MEDIA_TEMPLATE)
.putExtra(MediaIntentExtras.EXTRA_KEY_MEDIA_COMPONENT, MyMediaBrowserService::class.java)
.putExtra(MediaIntentExtras.EXTRA_KEY_SEARCH_QUERY, "Jazz")
.putExtra(MediaIntentExtras.EXTRA_KEY_SEARCH_ACTION, MediaIntentExtras.EXTRA_VALUE_PLAY_FIRST_ITEM_FROM_SEARCH)
context.startActivity(startMediaHostIntent)
Supportare i link diretti
Per migliorare l'esperienza della tua app multimediale sui dispositivi Android Automotive OS, puoi aggiungere il supporto dei deep link alla tua app. Ad esempio, questo consente agli utenti di aprire la tua app direttamente da un browser o quando ricevono un URL condiviso da un telefono utilizzando Quick Share.
Aggiungere filtri per intent di link diretti
Per comunicare al sistema operativo che la tua app è in grado di gestire i link diretti, deve avere attività con i filtri per intent appropriati. Per indicazioni sul formato dei filtri per intent utilizzati per i link diretti, consulta Aggiungere filtri per intent per i link in entrata.
Per garantire la migliore esperienza utente, supporta tutti i link diretti supportati dalla tua app mobile, se possono essere supportati ragionevolmente dalla tua app in-car. Se la tua app ha impostazioni o attività di accesso, i filtri per intent per la gestione delle impostazioni e dei link diretti di accesso devono essere dichiarati all'interno dei rispettivi elementi manifest <activity>. Per la riproduzione di contenuti multimediali e la navigazione nei link diretti, puoi utilizzare un'attività trampoline come descritto più avanti in questa sezione.
Gestire gli intent di link diretti
Consulta Leggere i dati dagli intent in entrata per indicazioni su come leggere e reagire all'intent utilizzato per avviare l'attività della tua app.
Gestire i link diretti per la riproduzione e la navigazione dei contenuti multimediali
Poiché l'interfaccia utente per la navigazione e la riproduzione è disegnata dall'app host, l'attività utilizzata per gestire i link diretti per le azioni di riproduzione e navigazione non deve avere un'interfaccia utente propria.
Deve invece essere utilizzato principalmente per creare e utilizzare un intent per avviare l'app host multimediale. Se necessario, può anche gestire eventuali modifiche aggiuntive allo stato dell'app, ad esempio l'aggiunta di elementi multimediali alla coda. Il seguente snippet mostra un'implementazione di esempio dell'attività di trampolino:
fun DeepLinkTrampolineActivity : ComponentActivity() {
override fun onCreate() {
handleIntent(intent)
}
override fun onNewIntent(intent: Intent) {
handleIntent(intent)
}
private fun handleIntent(intent: Intent) {
// Handle any side effects, such as adding a song to the queue
...
// Build the intent used to start the media host app
val startMediaHostIntent = ...
startActivity(intent)
// Finish the activity immediately so it isn't shown on screen
finish()
}
}
Leggi i suggerimenti per gli host dei contenuti multimediali
A seconda dell'applicazione di sistema (inclusa la relativa versione) che si connette al servizio di esplorazione dei contenuti multimediali, la tua applicazione potrebbe ricevere i seguenti extra:
Gestione degli errori
Gli errori nelle app multimediali su Android Automotive OS vengono comunicati utilizzando PlaybackStateCompat della sessione multimediale. Per tutti gli errori, imposta un codice di errore e un messaggio di errore appropriati in PlaybackStateCompat. In questo modo, nell'interfaccia utente viene visualizzato un Toast.
Quando si verifica un errore, ma la riproduzione può continuare, emetti un errore non fatale. Ad esempio, un utente potrebbe essere in grado di riprodurre musica in un'app prima di accedere, ma deve accedere prima di poter saltare un brano. Quando utilizzi un errore non fatale, il sistema può suggerire all'utente di accedere senza interrompere la riproduzione dell'elemento multimediale corrente.
Quando generi un errore non irreversibile, conserva il resto di
PlaybackStateCompat così com'è, a parte il codice e il messaggio di errore. L'utilizzo
di questo approccio consente la riproduzione dell'elemento multimediale corrente mentre
l'utente decide se accedere.
Quando la riproduzione non è possibile, ad esempio quando non è presente una connessione a internet e
non sono presenti contenuti offline, imposta lo stato di PlaybackStateCompat su STATE_ERROR.
Negli aggiornamenti successivi del tuo PlaybackStateCompat, cancella i codici di errore
e i messaggi di errore per evitare di visualizzare più avvisi per lo stesso errore.
Se in qualsiasi momento non riesci a caricare un albero di navigazione, ad esempio se
richiedi l'autenticazione e l'utente non ha eseguito l'accesso, invia un albero di navigazione vuoto. Per indicarlo, restituisci un risultato nullo da onLoadChildren() per
il nodo multimediale principale. In questo caso, il sistema visualizza un errore a schermo intero
con il messaggio di errore impostato in PlaybackStateCompat.
Errori che richiedono un intervento
Se un errore è azionabile, imposta anche i due seguenti extra in
PlaybackStateCompat:
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL: un'etichetta per il pulsante su cui fare clic per risolvere l'errore. Poiché questa stringa è visibile all'utente, localizzala per le impostazioni internazionali correnti dell'utente.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT: l'PendingIntentche il pulsante esegue per risolvere l'errore, ad esempio avviando l'attività di accesso.
Gli errori azionabili vengono visualizzati come Dialog e possono essere risolti dagli utenti solo quando
l'auto è ferma.
Testare i casi di errore
Verifica che la tua app gestisca correttamente gli errori in tutti gli scenari, tra cui:
- Diversi livelli del tuo prodotto: ad esempio, senza costi rispetto a premium o con accesso rispetto a senza accesso
- Diversi stati di guida:ad esempio, parcheggio e guida
- Diversi stati di connettività:ad esempio, online e offline
Altre considerazioni
Tieni a mente queste altre considerazioni quando sviluppi la tua app per Android Automotive OS:
Contenuto offline
Se applicabile, implementa il supporto della riproduzione offline. Le auto con Android Automotive OS dovrebbero avere una propria connettività dati, il che significa che un piano dati è incluso nel costo del veicolo o pagato dall'utente. Tuttavia, si prevede che le auto abbiano una connettività più variabile rispetto ai dispositivi mobili.
Ecco alcuni aspetti da tenere presente quando valuti la tua strategia di assistenza offline:
- Il momento migliore per scaricare i contenuti è mentre l'app è in uso.
- Non dare per scontato che il Wi-Fi sia disponibile. Un'auto potrebbe non rientrare mai nel raggio d'azione del Wi-Fi o l'OEM potrebbe aver disattivato il Wi-Fi a favore di una rete mobile.
- Anche se è consentito memorizzare nella cache i contenuti che prevedi che gli utenti utilizzino, ti consigliamo di consentire all'utente di modificare questo comportamento tramite l'attività delle impostazioni.
- Lo spazio su disco delle auto varia, quindi offri agli utenti un modo per eliminare i contenuti offline, ad esempio tramite un'opzione nell'attività delle impostazioni.
Supporto di WebView
Le WebView sono supportate in Android Automotive OS, ma sono consentite solo per le impostazioni e le attività di accesso. Le attività che utilizzano una WebView devono avere un'indicazione di "chiusura" o "indietro" al di fuori della WebView.
Ecco alcuni esempi di casi d'uso accettabili per le WebView:
- Visualizzazione delle norme sulla privacy, dei termini di servizio o di altri link correlati a questioni legali nell'attività delle impostazioni.
- Un flusso basato sul web nella tua attività di accesso.
Quando utilizzi un componente WebView, puoi attivare JavaScript.
Proteggere WebView
Prendi tutte le precauzioni possibili per assicurarti che WebView non sia un punto di accesso a internet. Vedi il seguente snippet di codice per un
esempio su come bloccare la WebView sull'URL utilizzato nella
chiamata loadUrl() e impedire i reindirizzamenti. Ti consigliamo vivamente di implementare misure di salvaguardia
come questa, quando possibile, ad esempio quando vengono visualizzati
link correlati ad aspetti legali.
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; }
Nomi pacchetto
Poiché distribuisci un kit Android Package (APK) separato per Android Automotive OS, puoi riutilizzare il nome del pacchetto della tua app mobile o crearne uno nuovo. Se utilizzi un nome di pacchetto diverso, la tua app ha due schede separate del Play Store. Se riutilizzi il nome del pacchetto attuale, la tua app avrà un'unica scheda su entrambe le piattaforme.
Si tratta principalmente di una decisione aziendale. Ad esempio, se hai un team che lavora all'app mobile e un team separato che lavora all'app Android Automotive OS, potrebbe essere utile avere nomi di pacchetti separati e consentire a ogni team di gestire la propria scheda del Play Store. Non c'è una grande differenza nell'impegno tecnico richiesto per utilizzare uno dei due approcci.
La seguente tabella riepiloga alcune altre differenze principali tra il mantenimento del nome del pacchetto attuale e l'utilizzo di un nuovo nome del pacchetto:
| Funzionalità | Stesso nome pacchetto | Nuovo nome pacchetto |
|---|---|---|
| Scheda dello Store | Single | Multiplo |
| Installazione con mirroring | Sì: "reinstallazione rapida delle app" durante la configurazione guidata | No |
| Procedura di revisione del Play Store | Blocco delle recensioni: se la revisione non viene superata per un APK, gli altri APK inviati nella stessa release vengono bloccati | Recensioni individuali |
| Statistiche, metriche e parametri vitali | Combinati: puoi filtrare i dati specifici per il settore automobilistico. | Separa |
| Indicizzazione e ranking nella ricerca | Basarsi sulla posizione attuale | Nessun riporto |
| Integrazione con altre app | Molto probabilmente non sono necessarie modifiche, supponendo che il codice multimediale sia condiviso tra entrambi gli APK | Potrebbe essere necessario aggiornare l'app corrispondente, ad esempio per la riproduzione di URI con l'Assistente Google. |
Domande frequenti
Consulta le sezioni seguenti per trovare le risposte ad alcune domande frequenti su Android Automotive OS.
Hardware
La mia app può accedere al microfono?
Per le app che hanno come target Android 10 (livello API 29) o versioni successive, consulta la documentazione relativa alla condivisione dell'input audio. Ciò non è fattibile prima del livello API 29.
A quali API per auto possiamo accedere e come?
Puoi utilizzare solo le API esposte dall'OEM. Sono in fase di sviluppo procedure per standardizzare l'accesso a queste API.
Le app possono accedere alle API dell'auto utilizzando SetProperty() e GetProperty() in CarPropertyManager.
Consulta il codice sorgente
o la documentazione di riferimento per visualizzare
un elenco di tutte le proprietà disponibili. Se la proprietà è annotata
con @SystemApi, è limitata alle app di sistema precaricate.
Quali tipi di codec audio sono supportati?
Consulta i dettagli del codec audio nel CDD di Android.
Il DRM Widevine è supportato?
Sì. Widevine DRM è supportato.
Sviluppo e test
Esistono restrizioni o consigli per l'utilizzo di SDK e librerie di terze parti?
Non abbiamo linee guida specifiche sull'utilizzo di SDK e librerie di terze parti. Se scegli di utilizzare SDK e librerie di terze parti, sei comunque responsabile della conformità a tutti i requisiti di qualità delle app per auto.
Posso utilizzare un servizio in primo piano?
L'unico caso d'uso consentito per un servizio in primo piano è il download di contenuti per l'utilizzo offline. Se hai un altro caso d'uso per un servizio in primo piano che vuoi vedere supportato, contattaci utilizzando il gruppo di discussione di Android Automotive OS.
Pubblicazione di app per Android Automotive OS
Come faccio a pubblicare la mia app per Android Automotive OS utilizzando Google Play Console?
Per informazioni dettagliate su come pubblicare la tua app per Android Automotive OS utilizzando Google Play Console, consulta la pagina Distribuire su auto.
Risorse aggiuntive
Per saperne di più su Android Automotive OS, consulta le seguenti risorse aggiuntive.
Esempi
Guide
- Design per la guida
- Utilizzare l'app di test del controller multimediale
- Notifiche su Android Automotive OS
- Qualità delle app per auto per Android
Blog
- Aggiornamenti di Android Automotive OS per gli sviluppatori
- Sviluppare app per Android Automotive OS
Video
- How to Build Media Apps for Cars (Android Dev Summit '19)
- Come creare app per Android per le auto (Google I/O'19)
Segnalare un problema relativo ai contenuti multimediali di Android Automotive OS
Se riscontri un problema durante lo sviluppo dell'app multimediale per Android Automotive OS, puoi segnalarlo utilizzando Google Issue Tracker. Assicurati di compilare tutte le informazioni richieste nel modello di problema.
Prima di segnalare un nuovo problema, controlla se è già stato segnalato nell'elenco dei problemi. Puoi iscriverti e votare i problemi facendo clic sulla stella di un problema nel tracker. Per saperne di più, consulta la sezione Iscrizione a un problema.