Il sistema operativo Android Automotive 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 il sistema operativo Android Automotive. Puoi riutilizzare quasi tutto il codice e le risorse nell'app Android Auto, ma devi creare una build separata che soddisfi i requisiti riportati in questa pagina.
Panoramica dello sviluppo
L'aggiunta del supporto del sistema operativo Android Automotive richiede solo pochi passaggi, come descritto nelle sezioni che seguono:
- Attiva le funzionalità per i veicoli in Android Studio.
- Crea un modulo per auto e motori.
- Aggiorna le dipendenze Gradle.
- (Facoltativo) Implementa le impostazioni e le attività di accesso.
- (Facoltativo) Leggi i suggerimenti per gli host di contenuti multimediali.
Considerazioni sul design
Il sistema operativo Android Automotive si occupa di gestire il layout dei contenuti multimediali che riceve dal servizio di browser multimediale della tua app. Ciò significa che l'app non disegna l'interfaccia utente e non avvia nessuna delle tue attività quando un utente attiva la riproduzione di contenuti multimediali.
Se implementi attività di impostazioni o 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 il sistema operativo Android Automotive, devi configurare diverse parti del progetto della tua app.
Attivare le funzionalità per auto e motori in Android Studio
Utilizza Android Studio 4.0 o versioni successive per assicurarti che tutte le funzionalità di Automotive OS siano attivate.
Creare un modulo per auto e motori
Alcuni componenti del sistema operativo Android Automotive, come il file manifest, hanno requisiti specifici della piattaforma. Crea un modulo che possa mantenere il codice di questi componenti separato dall'altro codice del progetto, ad esempio il codice utilizzato per l'app per smartphone.
Per aggiungere un modulo per auto e motori al progetto:
- In Android Studio, fai clic su File > Nuovo > Nuovo modulo.
- Seleziona Modulo Automotive e poi fai clic su Avanti.
- Inserisci un nome dell'applicazione/della raccolta. Questo è il nome che gli utenti vedono per la tua app sul sistema operativo Android Automotive.
- Inserisci un nome del modulo.
- Modifica il nome del pacchetto in modo che corrisponda a quello della tua app.
Seleziona API 28: Android 9.0 (Pie) per l'SDK minimo e poi fai clic su Avanti.
Tutte le auto che supportano il sistema operativo Android Automotive funzionano su Android 9 (livello API 28) o versioni successive, pertanto 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 e motori:
<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 per il sistema operativo Android Automotive. Tieni presente che nel file manifest non sono dichiarate attività.
Se implementi attività di impostazioni o accesso, aggiungile qui. Queste attività vengono attivate dal sistema utilizzando intent espliciti e sono le uniche attività dichiarate nel file manifest per la tua app per il sistema operativo Android Automotive.
Dopo aver aggiunto eventuali impostazioni o attività di accesso, completa il file manifest impostando l'attributo android:appCategory="audio"
nell'elemento application
e aggiungendo i seguenti elementi 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>
L'impostazione esplicita di queste funzionalità su required="false"
garantisce che la tua app non entri in conflitto con le funzionalità hardware disponibili nei dispositivi con Automotive OS.
Dichiarare il supporto dei contenuti multimediali per Android Automotive OS
Utilizza la seguente voce 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 file manifest fa riferimento a un file XML che dichiara le funzionalità per auto e motori 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
Il sistema operativo Android Automotive utilizza intent espliciti per attivare le attività nell'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 uno smartphone o un altro dispositivo mobile. Dichiara queste attività nel modulo che compila l'app per smartphone, non nel modulo che compila 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>
Aggiorna le dipendenze Gradle
Ti consigliamo di mantenere il servizio di browser multimediale in un modulo separato da condividere tra l'app per smartphone e il modulo per auto e motori. Se utilizzi questo approccio, devi aggiornare il modulo auto e motori per includere il modulo condiviso, come mostrato nel seguente snippet:
Groovy
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 browser multimediale, puoi anche fornire impostazioni e attività di accesso ottimizzate per il veicolo per la tua app per il sistema operativo Android Automotive. Queste attività ti consentono di fornire funzionalità dell'app non incluse nelle API Android Media.
Implementa queste attività solo se la tua app per il sistema operativo Android Automotive 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 in che modo un utente interagisce con le tue impostazioni e le attività di accesso utilizzando il sistema operativo Android Automotive:
Scoraggiare le distrazioni nelle impostazioni e nelle attività di accesso
Per assicurarti che le impostazioni e/o le attività di accesso siano disponibili solo quando il veicolo dell'utente è parcheggiato, verifica che gli elementi <activity>
non includano il seguente elemento <meta-data>
. Se è presente un elemento di questo tipo, la tua app verrà rifiutata durante la revisione.
<!-- 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 nell'auto. L'attività relativa alle impostazioni può fornire anche altri flussi di lavoro, ad esempio l'accesso o la disconnessione dall'account di un utente o il passaggio da un account utente all'altro. Ricorda che questa attività viene attivata solo da un'app in esecuzione su Android Automotive OS. Le app dello smartphone collegate ad Android Auto non lo utilizzano.
Dichiarare un'attività di impostazioni
Devi dichiarare l'attività di impostazioni nel file manifest dell'app, come mostrato nel seguente snippet di codice:
<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à di impostazioni
Quando un utente avvia la tua app, il sistema operativo Android Automotive rileva l'attività di impostazioni che hai dichiarato e mostra un'affordance, ad esempio un'icona.
L'utente può toccare o selezionare questa funzionalità utilizzando il display dell'auto per accedere all'attività. Il sistema operativo Android Automotive invia l'intent ACTION_APPLICATION_PREFERENCES
che indica alla tua app di avviare l'attività di impostazione.
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 di esempio:
# 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à:
- Copia la cartella
automotive/automotive-lib
nel modulo per auto e motori. - Definisci una struttura ad albero delle preferenze come in
automotive/src/main/res/xml/preferences.xml
. Implementa un
PreferenceFragmentCompat
che viene visualizzato nell'attività delle impostazioni. Per saperne di più, consulta i fileSettingsFragment.kt
eSettingsActivity.kt
in UAMP e la guida alle impostazioni Android.
Quando implementi l'attività di impostazioni, tieni presente queste best practice per l'utilizzo di alcuni dei 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 dell'organizzazione:
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
key
etitle
in tutti i componenti seguenti. Puoi anche includere unsummary
, unicon
o entrambi:Preference
- Personalizza la logica nel callback
onPreferenceTreeClick()
della tua implementazionePreferenceFragmentCompat
.
- Personalizza la logica nel callback
CheckBoxPreference
- Può avere
summaryOn
osummaryOff
anzichésummary
per il testo condizionale.
- Può avere
SwitchPreference
- Può avere
summaryOn
osummaryOff
anzichésummary
per il testo condizionale. - Può avere
switchTextOn
oswitchTextOff
.
- Può avere
SeekBarPreference
- Includi
min
,max
edefaultValue
.
- Includi
EditTextPreference
- Includi
dialogTitle
,positiveButtonText
enegativeButtonText
. - Può avere
dialogMessage
e/odialogLayoutResource
.
- Includi
com.example.android.uamp.automotive.lib.ListPreference
- Deriva principalmente da
ListPreference
. - Utilizzato per visualizzare un elenco a scelta singola di oggetti
Preference
. - Deve avere un array di
entries
eentryValues
corrispondenti.
- 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 avere un array di
entries
eentryValues
corrispondenti.
- Deriva principalmente da
Aggiungere un'attività di accesso
Se la tua app richiede che un utente acceda prima di poterla utilizzare, 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 accede. Tieni presente che questa attività viene attivata solo da un'app in esecuzione su Android Automotive OS. Le app dello 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 browser media deve:
- Nel metodo
onLoadChildren()
del servizio, invia il risultatonull
utilizzando il metodosendResult()
. - Imposta
PlaybackStateCompat
della sessione multimediale suSTATE_ERROR
utilizzando il metodosetState()
. Questo indica ad Android Automotive OS che non è possibile eseguire altre operazioni finché l'errore non è stato risolto. - Imposta il
PlaybackStateCompat
codice di errore della sessione multimediale suERROR_CODE_AUTHENTICATION_EXPIRED
. Questo indica al sistema operativo Android Automotive che l'utente deve autenticarsi. - Imposta il messaggio di errore
PlaybackStateCompat
della sessione multimediale utilizzando il metodosetErrorMessage()
. Poiché questo messaggio di errore è rivolto all'utente, localizzalo per le impostazioni internazionali correnti dell'utente. Imposta gli
PlaybackStateCompat
extra della sessione multimediale utilizzando il metodosetExtras()
. Includi le due chiavi seguenti:PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: una stringa visualizzata sul pulsante che avvia il flusso di lavoro di accesso. Poiché questa stringa è rivolta all'utente, localizzala per le impostazioni internazionali correnti dell'utente.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
: unPendingIntent
che indirizza l' utente alla tua attività di accesso quando tocca il pulsante a cui fa riferimento ilPLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
.
Il seguente snippet di codice mostra come la tua app può richiedere all'utente di accedere prima di utilizzarla:
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);
Dopo che l'utente è stato autenticato correttamente, imposta PlaybackStateCompat
su uno stato diverso da STATE_ERROR
,
quindi riporta l'utente al sistema operativo Android Automotive chiamando il metodo
finish()
dell'attività.
Implementare l'attività di accesso
Google offre una serie di strumenti per l'identità che puoi utilizzare per aiutare gli utenti ad accedere alla tua app nelle loro auto. Alcuni strumenti, come Firebase Authentication, forniscono kit di strumenti 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 problemi per gli utenti.
I seguenti strumenti possono aiutarti a creare un'esperienza di accesso più semplice per gli utenti che hanno eseguito l'accesso in precedenza su un altro dispositivo:
- Accesso e registrazione One Tap: se hai già implementato One Tap per altri dispositivi, ad esempio l'app del telefono, implementalo per la tua app del sistema operativo Android Automotive per supportare gli utenti One Tap esistenti.
- Accedi con Google: se hai già implementato Accedi con Google per altri dispositivi, ad esempio l'app del telefono, implementa Accedi con Google per l'app del sistema operativo Android Automotive per supportare gli utenti esistenti di Accedi con Google.
- Compilazione automatica Google:se gli utenti hanno attivato la compilazione automatica Google su altri dispositivi Android, le loro credenziali vengono salvate nel Gestore delle password di Google. Quando questi utenti accedono alla tua app per il sistema operativo Android Automotive, la funzionalità di compilazione automatica con Google suggerisce le credenziali salvate pertinenti. 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 con Google è supportata da tutti i dispositivi con Android 8.0 (livello API 26) o versioni successive, incluso il sistema operativo Android Automotive.
Utilizzare AccountManager
Le app per il sistema operativo Android Automotive che dispongono dell'autenticazione devono utilizzare AccountManager, per i seguenti motivi:
- Migliore UX e facilità di gestione degli account:gli utenti possono gestire facilmente tutti i loro account dal menu Account nelle impostazioni di sistema, inclusi l'accesso e la disconnessione.
- Esperienza"Ospite": le auto sono dispositivi condivisi, il che significa che gli OEM possono attivare nel veicolo esperienze "Ospite" in cui non è possibile aggiungere account. Questa
limitazione viene applicata utilizzando
DISALLOW_MODIFY_ACCOUNTS
perAccountManager
.
Autorizzazioni
Se devi richiedere le autorizzazioni all'utente, utilizza lo stesso flusso dell'attività di autenticazione o dell'attività di impostazioni nel diagramma dei flussi di lavoro delle attività mostrato in una sezione precedente.
Leggere i suggerimenti per gli host di contenuti multimediali
A seconda dell'applicazione di sistema (inclusa la relativa versione) che si connette al servizio del browser multimediale, l'applicazione potrebbe ricevere i seguenti extra:
Gestione degli errori
Gli errori nelle app multimediali su Android Automotive OS vengono comunicati tramite PlaybackStateCompat
della sessione multimediale. Per tutti gli errori, imposta un codice di errore e un messaggio di errore appropriati in PlaybackStateCompat
. Viene visualizzato un Toast
nell'interfaccia utente.
Quando si verifica un errore, ma la riproduzione può continuare, emetti un errore non letale. Ad esempio, un utente potrebbe essere in grado di riprodurre musica in un'app prima di accedere, ma deve accedere per poter saltare un brano. Quando utilizzi un errore non fatale, il sistema può suggerire all'utente di accedere senza interrompere la riproduzione per l'elemento multimediale corrente.
Quando emetti un errore non irreversibile, mantieni invariato il resto del
PlaybackStateCompat
, a parte il codice e il messaggio di errore. L'utilizzo di questo approccio consente di continuare la riproduzione dell'elemento multimediale corrente mentre l'utente decide se eseguire l'accesso.
Quando la riproduzione non è possibile, ad esempio quando non c'è una connessione a internet e non ci sono contenuti offline, imposta lo stato PlaybackStateCompat
su STATE_ERROR
.
Negli aggiornamenti successivi del PlaybackStateCompat
, cancella eventuali codici di errore e messaggi di errore per evitare di visualizzare più avvisi per lo stesso errore.
Se in un determinato momento non riesci a caricare una struttura di navigazione, ad esempio se richiedi l'autenticazione e l'utente non ha eseguito l'accesso, invia una struttura di navigazione vuota. Per indicare questo, restituisci un risultato nullo da onLoadChildren()
per il nodo media principale. In questo caso, il sistema mostra un messaggio di errore
a schermo intero con il messaggio di errore impostato in PlaybackStateCompat
.
Errori che possono essere corretti
Se un errore è risolvibile, imposta inoltre i seguenti due 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 è rivolta all'utente, localizzala in base alle impostazioni internazionali correnti dell'utente.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
:PendingIntent
eseguito dal pulsante per risolvere l'errore, ad esempio avviando l'attività di accesso.
Gli errori che possono essere risolti vengono visualizzati come Dialog
e possono essere risolti dagli utenti solo quando la vettura è ferma.
Testare i casi di errore
Verifica che la tua app gestisca gli errori in modo corretto in tutti gli scenari, ad esempio:
- Diverse fasce di prezzo del prodotto: ad esempio, versione senza costi o premium o accesso eseguito/accesso non eseguito
- Stati di guida diversi: ad esempio, auto parcheggiata o in movimento
- Stati di connettività diversi: ad esempio online e offline
Altre considerazioni
Tieni presenti queste altre considerazioni durante lo sviluppo della tua app per il sistema operativo Android Automotive:
Contenuti 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, le auto dovrebbero anche avere 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 è quando l'app è in uso.
- Non dare per scontato che il Wi-Fi sia disponibile. Un'auto potrebbe non entrare mai nel raggio d'azione del Wi-Fi oppure l'OEM potrebbe aver disattivato il Wi-Fi a favore di una rete mobile.
- Sebbene sia consentito memorizzare nella cache in modo intelligente i contenuti che gli utenti dovrebbero utilizzare, ti consigliamo di consentire all'utente di modificare questo comportamento tramite la tua attività di 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 nel sistema operativo Android Automotive, ma sono consentite solo per le tue impostazioni e le tue attività di accesso. Le attività che utilizzano un WebView devono avere un'affordance "Chiudi" o "Indietro" al di fuori del 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 relativi a questioni legali nella sezione 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 la tua WebView non sia un punto di accesso alla rete di internet. Consulta lo snippet di codice seguente per un
esempio su come bloccare WebView sull'URL utilizzato nella
chiamata loadUrl()
e impedire i reindirizzamenti. Ti consigliamo vivamente di implementare misure di salvaguardia come queste, se possibile, ad esempio quando mostri link correlati alla legge.
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 dei pacchetti
Poiché distribuisci un kit Android Application Package (APK) separato per il sistema operativo Android Automotive, puoi riutilizzare il nome del pacchetto della tua app mobile o crearne uno nuovo. Se utilizzi un nome di pacchetto diverso, la tua app avrà due schede del Play Store distinte. Se riutilizzi il nome del pacchetto attuale, la tua app avrà una singola scheda su entrambe le piattaforme.
Si tratta principalmente di una decisione commerciale. Ad esempio, se hai un team che lavora sull'app mobile e un altro team che lavora sull'app per il sistema operativo Android Automotive, potrebbe avere senso avere nomi di pacchetti separati e consentire a ciascun team di gestire la propria scheda del Play Store. Non esiste una grande differenza nell'impegno tecnico richiesto per utilizzare uno o l'altro approccio.
La seguente tabella riassume alcune altre differenze chiave tra il mantenimento del nome del pacchetto corrente e l'utilizzo di un nuovo nome del pacchetto:
Funzionalità | Stesso nome del pacchetto | Nuovo nome pacchetto |
---|---|---|
Scheda dello Store | Singolo | Più di uno |
Installazione speculare | Sì: "Reinstallazione rapida delle app" durante la configurazione guidata | No |
Procedura di revisione del Play Store | Blocco delle revisioni: se la revisione non va a buon fine per un APK, gli altri APK inviati nella stessa release vengono bloccati | Recensioni individuali |
Statistiche, metriche e indicatori | Combinato: puoi filtrare in base a dati specifici per il settore auto e motori. | Separa |
Indicizzazione e ranking nei risultati di ricerca | Basarsi sulla situazione attuale | Nessun trasferimento |
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 seguenti sezioni per trovare le risposte ad alcune domande frequenti sul sistema operativo Android Automotive.
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. Questa operazione non è fattibile prima del livello API 29.
A quali API per auto possiamo accedere e come?
Hai accesso solo alle API esposte dall'OEM. Sono in fase di sviluppo procedure per standardizzare la modalità di 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?
Fai riferimento ai dettagli del codec audio nel CDD di Android.
Il DRM Widevine è supportato?
Sì. Widevine DRM è supportato.
Sviluppo e test
Esistono limitazioni 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'uso offline. Se hai un altro caso d'uso per un servizio in primo piano per il quale vuoi richiedere il supporto, contattaci utilizzando il gruppo di discussione del sistema operativo Android Automotive.
Pubblicazione di app per Android Automotive OS
Come faccio a pubblicare la mia app per il sistema operativo Android Automotive utilizzando Google Play Console?
Per informazioni dettagliate su come pubblicare la tua app per Android Automotive OS utilizzando Google Play Console, consulta Distribuire su auto.
Risorse aggiuntive
Per scoprire di più su Android Automotive OS, consulta le seguenti risorse aggiuntive.
Campioni
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 del sistema operativo Android Automotive per gli sviluppatori
- Sviluppare app per Android Automotive OS
Video
- Come creare app multimediali per auto (Android Dev Summit '19)
- Come creare app per Android per auto (Google I/O'19)
Segnalare un problema relativo ai contenuti multimediali di Android Automotive OS
Se riscontri un problema durante lo sviluppo della tua app multimediale per il sistema operativo Android Automotive, puoi segnalarlo utilizzando il tracker dei problemi di Google. Assicurati di compilare tutte le informazioni richieste nel modello del problema.
Prima di segnalare un nuovo problema, controlla se è già presente nell'elenco. Puoi iscriverti e votare per i problemi facendo clic sulla stella accanto al problema nel tracker. Per ulteriori informazioni, consulta la sezione Iscriversi a un problema.