Aggiungere il supporto del sistema operativo Android Automotive alla tua app multimediale

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:

  1. Attiva le funzionalità per il settore automobilistico in Android Studio.
  2. Crea un modulo per il settore automobilistico.
  3. Aggiorna le dipendenze di Gradle.
  4. (Facoltativo) Implementa le impostazioni e le attività di accesso.
  5. (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:

  1. In Android Studio, fai clic su File > Nuovo > Nuovo modulo.
  2. Seleziona Modulo per il settore automobilistico e poi fai clic su Avanti.
  3. Inserisci un nome applicazione/libreria. Questo è il nome che gli utenti vedono per la tua app su Android Automotive OS.
  4. Inserisci un Nome modulo.
  5. Modifica il nome del pacchetto in modo che corrisponda alla tua app.
  6. 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.

  7. 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:

Workflows per le attività di impostazioni e accesso

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 repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

Per implementare l'attività, segui questi passaggi:

  1. Copia la cartella automotive/automotive-lib nel modulo automobilistico.
  2. Definisci una struttura delle preferenze come in automotive/src/main/res/xml/preferences.xml.
  3. Implementa un PreferenceFragmentCompat che viene visualizzato nell'attività delle impostazioni. Per saperne di più, consulta i file SettingsFragment.kt e SettingsActivity.kt in 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 un ListPreference.
  • Componenti organizzativi:
  • Includi un key e un title in tutti i seguenti componenti. Puoi anche includere un summary, un icon o entrambi:
    • Preference
      • Personalizza la logica nel callback onPreferenceTreeClick() dell'implementazione di PreferenceFragmentCompat.
    • CheckBoxPreference
      • Può avere summaryOn o summaryOff anziché summary per il testo condizionale.
    • SwitchPreference
      • Può avere summaryOn o summaryOff anziché summary per il testo condizionale.
      • Può avere switchTextOn o switchTextOff.
    • SeekBarPreference
      • Includi min, max e defaultValue.
    • EditTextPreference
      • Includi dialogTitle, positiveButtonText e negativeButtonText.
      • Può avere uno o entrambi i valori dialogMessage e dialogLayoutResource.
    • 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 entries e entryValues corrispondenti.
    • 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 entries e entryValues corrispondenti.

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:

  1. Nel metodo onLoadChildren() del servizio, invia il risultato null utilizzando il metodo sendResult().
  2. Imposta PlaybackStateCompat della sessione multimediale su STATE_ERROR utilizzando il metodo setState(). In questo modo, Android Automotive OS sa che non è possibile eseguire altre operazioni finché l'errore non è stato risolto.
  3. Imposta il codice di errore PlaybackStateCompat della sessione media su ERROR_CODE_AUTHENTICATION_EXPIRED. In questo modo, Android Automotive OS sa che l'utente deve autenticarsi.
  4. Imposta il messaggio di errore PlaybackStateCompat della sessione multimediale utilizzando il metodo setErrorMessage(). Poiché questo messaggio di errore è rivolto all'utente, localizzalo per le impostazioni internazionali correnti dell'utente.
  5. Imposta gli extra PlaybackStateCompat della sessione multimediale utilizzando il metodo setExtras(). Includi le seguenti due o tre chiavi:

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_ACCOUNTS per AccountManager.

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)

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.

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.

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:

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

Blog

Video

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.

Crea un nuovo 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.