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

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 indicati in questa pagina.

Panoramica dello sviluppo

L'aggiunta del supporto del sistema operativo Android Automotive richiede solo pochi passaggi, come descritto nelle sezioni seguenti:

  1. Attiva le funzionalità relative ad auto e motori in Android Studio.
  2. Crea un modulo Automotive.
  3. Aggiorna le dipendenze Gradle.
  4. (Facoltativo) Implementa impostazioni e attività di accesso.

Considerazioni sul design

Il sistema operativo Android Automotive si occupa del layout dei contenuti multimediali che riceve dal servizio browser di contenuti multimediali della tua app. Ciò significa che l'app non traccia l'interfaccia utente e non avvia alcuna attività quando un utente attiva la riproduzione di contenuti multimediali.

Se implementi impostazioni o attività di accesso, queste attività devono essere ottimizzate per il veicolo. Consulta le linee guida sulla progettazione del sistema operativo Android Automotive durante la progettazione di queste aree dell'app.

Configura il progetto

Devi configurare diverse parti del progetto della tua app per abilitare il supporto del sistema operativo Android Automotive.

Attivare le funzionalità relative ad auto e motori in Android Studio

Utilizza Android Studio 4.0 o versioni successive per assicurarti che tutte le funzionalità del sistema operativo Automotive siano abilitate.

Crea un modulo Auto e motori

Alcuni componenti del sistema operativo Android Automotive, ad esempio 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 telefono.

Per aggiungere un modulo relativo ad auto e motori al tuo progetto, segui questi passaggi:

  1. In Android Studio, fai clic su File > Nuovo > Nuovo modulo.
  2. Seleziona Modulo auto, poi fai clic su Avanti.
  3. Inserisci un Nome applicazione/libreria. Questo è il nome della tua app che gli utenti vedranno per il sistema operativo Android Automotive.
  4. Inserisci un Nome modulo.
  5. Modifica il Nome del pacchetto in modo che corrisponda a quello dell'app.
  6. Seleziona API 28: Android 9.0 (Pie) per SDK minimo, quindi fai clic su Avanti.

    Tutte le auto che supportano il sistema operativo Android Automotive 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 fai clic su Fine.

Dopo aver creato il modulo in Android Studio, apri AndroidManifest.xml nel nuovo modulo Automotive:

<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 e un elemento uses-feature che dichiara il supporto del sistema operativo Android Automotive. Tieni presente che non ci sono attività dichiarate nel manifest.

Se implementi impostazioni o attività di accesso, aggiungile qui. Queste attività vengono attivate dal sistema utilizzando intent espliciti e sono le uniche attività dichiarate nel manifest per l'app del sistema operativo Android Automotive.

Dopo aver aggiunto 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 OS Automotive.

Dichiara il supporto dei contenuti multimediali per il sistema operativo Android Automotive

Utilizza la seguente voce del manifest per dichiarare che la tua app supporta il sistema operativo Android Automotive:

<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à del settore 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/ del tuo progetto. Includi nel file i seguenti contenuti:

<automotiveApp>
    <uses name="media"/>
</automotiveApp>

Filtri per intent

Il sistema operativo Android Automotive utilizza intent espliciti per attivare attività nella tua app multimediale. Non includere attività che hanno filtri di 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 Telefono, non nel modulo che crea l'app per il sistema operativo Android Automotive.

<activity android:name=".MyActivity">
    <intent-filter>
        <!-- You can't use either of these intents for Android Automotive OS -->
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <!--
        In their place, you can include other intent filters for any activities
        that your app needs for Android Automotive OS, such as settings or
        sign-in activities.
        -->
    </intent-filter>
</activity>

Aggiorna le dipendenze Gradle

Ti consigliamo di conservare il servizio di browser di contenuti multimediali in un modulo separato da condividere tra l'app per telefono e il modulo per il settore auto e motori. Se utilizzi questo approccio, devi aggiornare il modulo relativo ad Auto e motori in modo da includere il modulo condiviso, come mostrato nello snippet seguente:

my-auto-module/build.gradle

trendy

buildscript {
    ...
    dependencies {
        ...
        implementation project(':shared_module_name')
    }
}

Kotlin

buildscript {
    ...
    dependencies {
        ...
        implementation(project(":shared_module_name"))
    }
}

Implementare impostazioni e attività di accesso

Oltre al servizio di browser per contenuti multimediali, puoi fornire impostazioni ottimizzate per il veicolo e attività di accesso 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 l'app del 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:

Flussi di lavoro per le impostazioni e le attività di accesso

Figura 1. Flussi di lavoro relativi alle impostazioni e alle attività di accesso.

Scoraggiare le distrazioni causate dalle impostazioni e dalle attività di accesso

Per assicurarti che le impostazioni e/o le attività di accesso possano essere utilizzate solo quando il veicolo dell'utente è parcheggiato, verifica che l'elemento <activity> non includa il seguente elemento <meta-data>. Durante la revisione l'app verrà rifiutata se è presente un elemento di questo tipo.

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

Aggiungi un'attività relativa alle impostazioni

Aggiungi un'attività correlata alle impostazioni ottimizzate per il veicolo per consentire agli utenti di configurare le impostazioni per la propria auto. L'attività relativa alle impostazioni può anche fornire altri flussi di lavoro, ad esempio per accedere o uscire dall'account di un utente o per cambiare account utente. Ricorda che questa attività viene attivata solo da un'app in esecuzione sul sistema operativo Android Automotive. Le app del telefono collegate ad Android Auto non la usano.

Dichiarare un'attività relativa alle impostazioni

Devi dichiarare l'attività relativa alle impostazioni nel file manifest della tua 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à relativa alle impostazioni

Quando un utente avvia la tua app, il sistema operativo Android Automotive rileva l'attività relativa alle impostazioni che hai dichiarato e mostra un'offerta, ad esempio un'icona. L'utente può toccare o selezionare l'offerta utilizzando il display dell'auto per andare all'attività. Il sistema operativo Android Automotive invia l'intent ACTION_APPLICATION_PREFERENCES che indica alla tua app di avviare l'attività relativa alle impostazioni.

Il resto di questa sezione mostra come adattare il codice dell'app di esempio per il player di musica Android universale (UAMP) per implementare un'attività relativa alle 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 la tua attività, segui questi passaggi:

  1. Copia la cartella automotive/automotive-lib nel modulo Automotive.
  2. Definisci un albero delle preferenze come automotive/src/main/res/xml/preferences.xml.
  3. Implementa un elemento PreferenceFragmentCompat visualizzato dall'attività relativa alle impostazioni. Per saperne di più, consulta i file SettingsFragment.kt e SettingsActivity.kt in UAMP e la guida alle impostazioni di Android.

Durante l'implementazione dell'attività relativa alle impostazioni, prendi in considerazione 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à relativa alle impostazioni.
  • Non utilizzare una DropDownPreference. Utilizza invece una ListPreference.
  • Componenti organizzativi:
  • Includi key e title in tutti i componenti seguenti. Puoi anche includere un elemento summary, un icon o entrambi:
    • Preference
      • Personalizza la logica nel callback onPreferenceTreeClick() dell'implementazione 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.
      • Possono avere switchTextOn o switchTextOff.
    • SeekBarPreference
      • Includi min, max e defaultValue.
    • EditTextPreference
      • Includi dialogTitle, positiveButtonText e negativeButtonText.
      • Possono avere dialogMessage e/o dialogLayoutResource.
    • com.example.android.uamp.automotive.lib.ListPreference
      • Ricava principalmente da ListPreference.
      • Utilizzato per visualizzare un elenco a scelta singola di Preference oggetti.
      • Deve avere un array di entries e il valore entryValues corrispondente.
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • Deriva principalmente da MultiSelectListPreference
      • Utilizzato per visualizzare un elenco a scelta multipla di Preference oggetti.
      • Deve avere un array di entries e il valore entryValues corrispondente.

Aggiungi un'attività di accesso

Se la tua app richiede a un utente di eseguire l'accesso prima di poter utilizzare l'app, puoi aggiungere un'attività di accesso ottimizzata per i veicoli che gestisce l'accesso e l'uscita dall'app. Puoi anche aggiungere flussi di lavoro di accesso e uscita a un'attività relativa alle impostazioni, ma puoi utilizzare 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 sul sistema operativo Android Automotive. Le app del telefono collegate ad Android Auto non la utilizzano.

Richiedi accesso all'avvio dell'app

Per richiedere a un utente di eseguire l'accesso prima di poter utilizzare la tua app, il servizio browser multimediale deve:

  1. Nel metodo onLoadChildren() del tuo servizio, invia il risultato null usando il metodo sendResult().
  2. Imposta il valore PlaybackStateCompat della sessione multimediale su STATE_ERROR utilizzando il metodo setState(). Questo indica al sistema operativo Android Automotive che non è possibile eseguire altre operazioni finché l'errore non è stato risolto.
  3. Imposta il codice di errore PlaybackStateCompat della sessione multimediale su ERROR_CODE_AUTHENTICATION_EXPIRED. Questo indica al sistema operativo Android Automotive che l'utente deve eseguire l'autenticazione.
  4. Imposta il messaggio di errore PlaybackStateCompat della sessione multimediale utilizzando il metodo setErrorMessage(). Poiché questo messaggio di errore è rivolto agli utenti, localizzalo in base alle impostazioni internazionali correnti dell'utente.
  5. Imposta gli extra PlaybackStateCompat della sessione multimediale utilizzando il metodo setExtras(). Includi le seguenti due chiavi:

Il seguente snippet di codice mostra in che modo la tua app può richiedere all'utente di eseguire l'accesso 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);

Dopo che l'utente è stato autenticato correttamente, imposta di nuovo PlaybackStateCompat su uno stato diverso da STATE_ERROR, quindi riporta l'utente al sistema operativo Android Automotive chiamando il metodo finish() dell'attività.

Implementare le attività di accesso

Google offre una varietà 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 completi 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 fluide 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 con un tocco: se hai già implementato One Tap per altri dispositivi, ad esempio l'app Telefono, implementalo per l'app del sistema operativo Android Automotive in modo da supportare gli utenti One Tap esistenti.
  • Accedi con Google: se hai già implementato Accedi con Google per altri dispositivi, ad esempio l'app Telefono, implementa Accedi con Google per l'app per il sistema operativo Android Automotive in modo da supportare gli utenti Accedi con Google esistenti.
  • Compilazione automatica Google: se gli utenti hanno attivato la compilazione automatica Google sugli altri loro dispositivi Android, le loro credenziali vengono salvate nel Gestore delle password di Google. Quando questi utenti accedono alla tua app del sistema operativo Android Automotive, la Compilazione automatica Google suggerisce credenziali pertinenti salvate. L'utilizzo della Compilazione automatica Google non richiede lo sviluppo di applicazioni. Tuttavia, gli sviluppatori di applicazioni possono ottimizzare le proprie app per ottenere risultati di qualità migliori. La compilazione automatica Google è supportata da tutti i dispositivi con Android 8.0 (livello API 26) o versioni successive, incluso il sistema operativo Android Automotive.

Utilizza AccountManager

Le app del sistema operativo Android Automotive dotate di autenticazione devono utilizzare AccountManager per i seguenti motivi:

  • Esperienza utente migliorata e facilità di gestione degli account: gli utenti possono gestire facilmente tutti i propri account dal menu Account nelle impostazioni di sistema, compresi 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 raggiunta 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 nello schema dei flussi di lavoro delle attività mostrato in una sezione precedente.

Gestione degli errori

Gli errori nelle app multimediali sul sistema operativo Android Automotive vengono comunicati tramite PlaybackStateCompat della sessione multimediale. Per tutti gli errori, imposta un codice e un messaggio di errore appropriati in PlaybackStateCompat. Questo causa la visualizzazione di un elemento Toast nell'interfaccia utente.

Quando si verifica un errore, ma la riproduzione può continuare, genera un errore non irreversibile. Ad esempio, un utente potrebbe essere in grado di riprodurre musica in un'app prima di accedere, ma deve eseguire l'accesso per poter saltare un brano. Se utilizzi un errore non irreversibile, 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'è, oltre al codice e al messaggio di errore. Questo approccio consente di continuare la riproduzione dell'elemento multimediale corrente mentre l'utente decide se eseguire o meno l'accesso.

Quando non è possibile riprodurre, ad esempio in assenza di connessione a internet o di contenuti offline, imposta lo stato PlaybackStateCompat su STATE_ERROR.

Negli aggiornamenti successivi di PlaybackStateCompat, cancella eventuali codici e messaggi di errore per evitare di mostrare più avvisi per lo stesso errore.

Se in qualsiasi momento non riesci a caricare una struttura di esplorazione, ad esempio se richiedi l'autenticazione e l'utente non ha eseguito l'accesso, invia una struttura di esplorazione vuota. Per indicare ciò, restituisci un risultato null da onLoadChildren() per il nodo multimediale radice. In questo caso, il sistema mostra un errore a schermo intero con il messaggio di errore impostato in PlaybackStateCompat.

Errori attuabili

Se è possibile intervenire su un errore, imposta anche i seguenti due extra nella sezione PlaybackStateCompat:

Gli errori risolvibili vengono visualizzati come Dialog e possono essere risolti dagli utenti solo quando l'auto è ferma.

Test dei casi di errore

Verifica che la tua app gestisca in modo controllato gli errori in tutti gli scenari, tra cui:

  • Diversi livelli di prodotto: ad esempio senza costi o premium oppure senza accesso o disconnesso.
  • Stati di guida diversi: ad esempio, parcheggiato e alla guida
  • Diversi stati della connettività, ad esempio online e offline.

Altre considerazioni

Durante lo sviluppo della tua app per il sistema operativo Android Automotive, tieni presente queste altre considerazioni:

Contenuti offline

Se applicabile, implementa il supporto per la riproduzione offline. Le auto con sistema operativo Android Automotive devono 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 anche 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 sia disponibile una rete Wi-Fi. il Wi-Fi potrebbe non essere mai raggiunto o l'OEM potrebbe aver disattivato il Wi-Fi a favore della rete cellulare.
  • Anche se è consentito memorizzare in modo intelligente nella cache i contenuti che dovrebbero essere utilizzati dagli utenti, ti consigliamo di consentire all'utente di modificare questo comportamento tramite l'attività relativa alle impostazioni.
  • Lo spazio su disco delle auto varia, quindi offri agli utenti un modo per eliminare i contenuti offline, ad esempio tramite un'opzione nelle attività delle impostazioni.

Supporto per WebView

I componenti WebView sono supportati nel sistema operativo Android Automotive, ma sono consentiti solo per le tue impostazioni e attività di accesso. Le attività che utilizzano un componente WebView devono avere un'autorizzazione di "chiusura" o "indietro" al di fuori di WebView.

Ecco alcuni esempi di casi d'uso accettabili per WebView:

  • Mostrare le tue norme sulla privacy, i tuoi termini di servizio o altri link di tipo legale nell'attività relativa alle impostazioni.
  • Un flusso basato sul web delle tue attività di accesso.

Quando utilizzi un componente WebView, puoi attivare JavaScript.

Proteggi la tua WebView

Prendi tutte le precauzioni possibili per assicurarti che il tuo componente WebView non sia un punto di accesso a internet. Consulta il seguente snippet di codice per un esempio su come bloccare WebView nell'URL utilizzato nella chiamata loadUrl() e impedire i reindirizzamenti. Ti consigliamo vivamente di implementare misure di protezione come questa, ove possibile, ad esempio in caso di visualizzazione di link di natura legale.

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 APK (Android Package Kit) separato per il sistema operativo Android Automotive, puoi riutilizzare il nome del pacchetto dalla tua app mobile o crearne uno nuovo. Se utilizzi un nome di pacchetto diverso, la tua app ha due schede del Play Store separate. Se riutilizzi il nome del pacchetto corrente, la tua app ha una sola scheda su entrambe le piattaforme.

Si tratta prevalentemente di una decisione aziendale. Ad esempio, se hai un team che lavora all'app mobile e un altro all'app per il sistema operativo Android Automotive, potrebbe avere senso avere nomi di pacchetti separati e lasciare che ogni team gestisca la propria scheda del Play Store. Non c'è una grande differenza nello sforzo tecnico necessario per utilizzare entrambi gli approcci.

La seguente tabella riassume alcune altre differenze fondamentali tra la conservazione del nome del pacchetto attuale e l'utilizzo di un nuovo nome del pacchetto:

Funzionalità Stesso nome del pacchetto Nuovo nome pacchetto
Scheda dello Store Singolo Diversi
Installazione con mirroring Sì: "reinstallazione rapida dell'app" durante la configurazione guidata No
Procedura di revisione del Play Store Blocco delle recensioni: se la revisione non va a buon fine per un APK, gli altri APK inviati nella stessa release vengono bloccati. Recensioni singole
Statistiche, metriche e vitali Combinato: puoi filtrare in base a dati specifici del settore auto e motori. Separa
Indicizzazione e ranking nei risultati di ricerca Basati 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 dell'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ò avere accesso 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 è possibile 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 dei processi per standardizzare il modo in cui accedi a queste API.

Le app possono accedere alle API per auto utilizzando SetProperty() e GetProperty() in CarPropertyManager. Fai riferimento al codice sorgente o alla 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.

Widevine DRM è 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 usare SDK e librerie di terze parti, devi comunque rispettare 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 per il quale vuoi ricevere assistenza, contattaci utilizzando il gruppo di discussione del sistema operativo Android Automotive.

Pubblicazione di app per il sistema operativo Android Automotive

Come faccio a pubblicare la mia app del sistema operativo Android Automotive utilizzando Google Play Console?

La procedura di pubblicazione delle app è simile alla pubblicazione di un'app per smartphone, ma utilizzi un fattore di forma diverso. Per attivare l'utilizzo del fattore di forma del sistema operativo Android Automotive:

  1. Apri Play Console.
  2. Seleziona l'app.
  3. Nel menu a sinistra, fai clic su Release > Configurazione > Impostazioni avanzate > Fattori di forma.
  4. Fai clic su Aggiungi fattore di forma > Sistema operativo Android Automotive, quindi segui le istruzioni in Play Console.

Risorse aggiuntive

Per saperne di più sul sistema operativo Android Automotive, consulta le seguenti risorse aggiuntive.

Campioni

Guide

Blog

Video

Segnalare un problema relativo ai contenuti multimediali del sistema operativo Android Automotive

Se riscontri un problema durante lo sviluppo della tua app multimediale per il sistema operativo Android Automotive, puoi segnalarlo utilizzando lo strumento Issue Tracker di Google. Assicurati di compilare tutte le informazioni richieste nel modello del problema.

Crea un nuovo problema

Prima di inviare un nuovo problema, controlla se è già stato segnalato nell'elenco dei problemi. Puoi iscriverti e votare i problemi facendo clic sulla stella accanto a un problema nel tracker. Per ulteriori informazioni, consulta la sezione Iscrizione a un problema.