Aggiungere il supporto di Android Automotive OS all'app di parcheggio

Quando distribuisci la tua app su dispositivi con sistema operativo Android Automotive, devi tenere conto di alcune considerazioni specifiche del fattore di forma. Questa guida illustra queste considerazioni.

Testa la tua app esistente su un emulatore Android Automotive OS

Per iniziare a creare la tua app per Android Automotive OS, prova prima la tua app esistente su un emulatore Android Automotive OS. Per configurare un emulatore, segui i passaggi descritti in Eseguire test utilizzando l'emulatore Android Automotive OS. Puoi quindi eseguire l'app seguendo le istruzioni riportate in Eseguire l'app sull'emulatore.

Quando esegui l'app, controlla la presenza di problemi di compatibilità, ad esempio:

  • Gli schermi dell'infotainment hanno orientamenti fissi. Per rispettare le norme sulla qualità delle app per auto, le app devono supportare gli orientamenti verticale e orizzontale.
  • Le API disponibili su altri dispositivi potrebbero non essere disponibili su Android Automotive OS. Ad esempio, alcune API di Google Play Services non sono disponibili su Android Automotive OS. Consulta la sezione Disattivare le funzionalità per maggiori dettagli su come gestire questi problemi.

Configura il file manifest dell'app

Per scegliere come target i dispositivi con sistema operativo Android Automotive, la tua app deve avere determinate voci del file manifest. Dopo aver attivato la distribuzione per i dispositivi con sistema operativo Android Automotive, le app compatibili vengono sottoposte a una procedura di revisione manuale per garantire che siano sicure per l'utilizzo in auto. Per ulteriori dettagli, vedi Distribuire su auto.

Funzionalità di Android Automotive OS richieste

Tutte le app create per il sistema operativo Android Automotive devono soddisfare determinati requisiti per essere distribuite tramite Google Play. Per ulteriori informazioni, consulta la sezione Soddisfare i requisiti delle funzionalità di Google Play.

Voci manifest specifiche per categoria

Oltre ai requisiti precedenti, che si applicano a tutte le app parcheggiate, le categorie Video e Giochi hanno requisiti aggiuntivi:

Soddisfare i requisiti di distrazione del conducente

Evitare le distrazioni del conducente è fondamentale quando porti la tua app nelle auto. Per le app messe in pausa, questo viene ottenuto principalmente impedendo l'utilizzo o la riproduzione di audio dell'app quando sono attive le limitazioni relative all'esperienza utente (UX), come indicato dalle linee guida sulla qualità DD-2 e DD-3.

Impedire l'utilizzo quando sono attive le limitazioni dell'esperienza utente

Per impostazione predefinita, le attività non possono essere utilizzate o avviate quando le limitazioni UX sono attivate. Per assicurarti che questo comportamento si applichi alla tua app, non deve includere il seguente elemento <meta-data> in nessun elemento <activity> all'interno del manifest:

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

Se un'attività nella tua app è Riprendi quando le limitazioni dell'esperienza utente diventano attive, viene nascosta da un'attività di proprietà del sistema operativo.

Come minimo, l'attività della tua app passa allo stato di ciclo di vita In pausa. Questo avviene come onPause() callback del ciclo di vita durante il quale devi mettere in pausa sia la riproduzione video che quella audio dall'app.

Sui dispositivi che includono la modalità di compatibilità con il sistema operativo Android Automotive, il blocco del sistema fa sì che le attività dell'app passino dallo stato In pausa allo stato Interrotta.

Interrompere la riproduzione ed evitare la ripresa

Per alcune app, mettere in pausa la riproduzione durante onPause() e monitorare lo stato per impedire la ripresa della riproduzione fino a onResume() è sufficiente per soddisfare i requisiti relativi alle distrazioni del conducente.

Se la reazione ai callback del ciclo di vita non è sufficiente per la tua app, puoi ascoltare direttamente lo stato delle limitazioni UX come descritto nella sezione seguente. Ad esempio, le app che supportano la modalità Picture in picture potrebbero preferire ascoltare direttamente anziché avere controlli condizionali nei callback del ciclo di vita.

Ascolta le restrizioni relative all'esperienza utente

Per ascoltare le limitazioni dell'esperienza utente, aggiungi prima una dipendenza dalla biblioteca android.car nel file build.gradle del modulo dell'app. Si tratta di un'estensione dell'SDK Android che fornisce API specifiche per Android Automotive OS.

android {
    ...
    useLibrary("android.car")
}

Utilizza CarUxRestrictionsManager per leggere lo stato della limitazione dell'esperienza utente. Non tentare di determinare lo stato delle limitazioni UX da altri stati hardware come la marcia o la velocità, perché le limitazioni UX possono variare da un display all'altro all'interno di un veicolo.

val car = Car.createCar(context)
val carUxRestrictionsManager =
    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as CarUxRestrictionsManager

// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentUxRestrictions

// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions -> ...}

// Don't forget to teardown and release resources when they're no longer needed
carUxRestrictionsManager.unregisterListener()
car.disconnect()

L'unico valore fornito da CarUxRestrictions a cui deve fare riferimento la tua app è il valore restituito da isRequiresDistractionOptimization(). Gli altri valori sono pertinenti solo per le attività contrassegnate come ottimizzate per le distrazioni.

Verificare la tua implementazione

Verifica che la tua app soddisfi i requisiti relativi alla distrazione alla guida utilizzando la seguente procedura:

  1. Installa l'app su un'immagine di sistema senza il Google Play Store o la modalità di compatibilità.
  2. Con la griglia delle app di Avvio app aperta, simula la guida e verifica che l'app non possa essere aperta.
  3. Interrompi la simulazione di guida, apri l'app in una schermata di riproduzione e avvia la riproduzione.
  4. Simula di nuovo la guida e verifica che la riproduzione venga messa in pausa.
    1. Se la tua app supporta l'integrazione con MediaSession, utilizza adb shell cmd media_session dispatch play e verifica che la riproduzione non riprenda.

Ottimizzare l'app per Android Automotive OS

Per offrire agli utenti la migliore esperienza possibile in auto, tieni presente quanto segue durante la creazione dell'app per il sistema operativo Android Automotive:

Lavorare con inserti di finestre e ritagli del display

Come per altri fattori di forma, il sistema operativo Android Automotive include elementi dell'interfaccia utente di sistema, come barre di stato e di navigazione, e il supporto per display non rettangolari.

Per impostazione predefinita, le app vengono disegnate in un'area che non si sovrappone alle barre di sistema o ai ritagli del display. Tuttavia, potresti voler nascondere le barre di sistema nell'app, disegnare contenuti dietro di esse o mostrare contenuti in un ritaglio del display come descritto in Disporre l'app all'interno degli inserti della finestra. Se la tua app esegue una di queste operazioni, consulta le seguenti sottosezioni per informazioni dettagliate su come farla funzionare correttamente nell'ecosistema dei dispositivi Android Automotive OS.

Barre di sistema, modalità immersiva e rendering edge-to-edge

Le barre di sistema nelle auto potrebbero avere dimensioni e posizione diverse rispetto ad altri fattori di forma. Ad esempio, le barre di navigazione possono essere posizionate a sinistra, a destra o nella parte inferiore dello schermo. Anche se è presente una barra di stato in alto e una barra di navigazione in basso (come nella maggior parte di smartphone e tablet), le dimensioni di questi elementi saranno probabilmente molto maggiori nelle auto.

Inoltre, il sistema operativo Android Automotive consente agli OEM di controllare se le app possono mostrare o nascondere le barre di sistema per entrare ed uscire dalla modalità immersiva. Ad esempio, impedendo alle app di nascondere le barre di sistema, gli OEM possono assicurarsi che i controlli del veicolo, come quelli climatici, siano sempre accessibili sullo schermo. Se un OEM ha impedito alle app di controllare le barre di sistema, non succede nulla quando un'app chiama le API WindowInsetsController (o WindowInsetsControllerCompat) per mostrare o nascondere le barre di sistema. Consulta la documentazione di show e hide per scoprire di più su come rilevare se la tua app è riuscita a modificare gli rientramenti.

Analogamente, gli OEM possono anche controllare se le app possono impostare o meno il colore e la translucenza delle barre di sistema per assicurarsi che le barre e gli elementi al loro interno siano sempre ben visibili. Se la tua app viene visualizzata da un lato all'altro dello schermo, verifica che dietro le barre di sistema vengano visualizzati solo contenuti non critici. Questi contenuti potrebbero non essere visibili se l'OEM del dispositivo impedisce di impostare il colore o la trasparenza delle barre.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

Se la tua app è da un'estremità all'altra, non fare supposizioni sulle dimensioni, sul numero, sul tipo o sulla posizione delle barre di sistema. Utilizza invece le API di incavo della finestra per disporre i contenuti della tua app in base alle barre di sistema. Per ulteriori dettagli su come utilizzare queste API, consulta la sezione Mostrare i contenuti a schermo intero nella tua app. I valori di spaziatura hardcoded non sono mai consigliati per nessun fattore di forma, ma nelle auto probabilmente non funzioneranno per mantenere i contenuti nell'area di sicurezza.

Adattarsi a display di forma irregolare

Oltre ai display rettangolari, alcuni veicoli potrebbero avere schermi di forma irregolare, come mostrato nella Figura 1:

Un diagramma di un dispositivo con sistema operativo Android Automotive con un display curvo sul lato destro.
Figura 1: un dispositivo con sistema operativo Android Automotive con un display curvo sul lato destro. L'area verde è il rettangolo sicuro che non si sovrappone al riquadro delimitante del ritaglio della visualizzazione della curva.

Se la tua app non viene visualizzata a schermo intero, non devi fare nulla per visualizzarla nell'area sicura.

Se la tua app viene visualizzata edge-to-edge, puoi scegliere come deve comportarsi rispetto ai ritagli del display. Puoi farlo utilizzando le risorse impostando l'attributo android:windowLayoutInDisplayCutoutMode per il tema dell'app o in fase di esecuzione modificando l'attributo layoutInDisplayCutoutMode della finestra.

Poiché i tipi di ritagli del display presenti sui dispositivi con sistema operativo Android Automotive sono diversi da quelli sui dispositivi mobili, non utilizzare LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT o LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, il cui comportamento è ottimizzato per i ritagli presenti sui dispositivi mobili. Utilizza invece LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER o LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS per evitare sempre o inserire sempre il ritaglio. Se scegli la seconda opzione, consulta Supportare i ritagli del display per ulteriori dettagli sulle API relative ai ritagli del display.

Se la tua app viene visualizzata nell'area del ritaglio del display e vuoi avere un comportamento diverso tra il sistema operativo Android Automotive e il mobile, consulta Disattivare le funzionalità per indicazioni se la tua app imposta questo comportamento in fase di esecuzione e Utilizzare risorse alternative se la tua app imposta questo comportamento utilizzando i file di risorse.

Disattivare le funzionalità

Se rendi disponibile un'app mobile esistente su Android Automotive OS, alcune funzionalità potrebbero non essere pertinenti o disponibili. Ad esempio, le auto in genere non forniscono l'accesso alle videocamere. Inoltre, solo un insieme limitato di Google Play Services è disponibile su Android Automotive OS. Per ulteriori dettagli, consulta Google Play Services per auto.

Puoi utilizzare l'API PackageManager.hasSystemFeature per rilevare se l'app è in esecuzione su Android Automotive OS controllando la funzionalità FEATURE_AUTOMOTIVE, come mostrato nell'esempio seguente:

Kotlin

val packageManager: PackageManager = ... // Get a PackageManager from a Context
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Java

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

In alternativa, se la tua app ha anche un componente Android Auto, puoi utilizzare l'API CarConnection della raccolta di app Android for Cars per rilevare se l'app è in esecuzione su Android Automotive OS o Android Auto oppure se non è collegata a un'auto.

Per la modalità Picture in picture (PiP), segui le best practice stabilite per verificare se la funzionalità è disponibile e reagisci di conseguenza.

Gestire gli scenari offline

Anche se le auto sono sempre più connesse a internet, è consigliabile che le app gestiscano l'esecuzione senza una connessione a internet, ad esempio nei seguenti casi:

  • Gli utenti potrebbero disattivare i dati mobili offerti nell'ambito di un pacchetto di abbonamento del produttore di auto.
  • L'accesso ai dati mobili potrebbe essere limitato in alcune aree.
  • Le auto con radio Wi-Fi potrebbero non essere coperte dal segnale Wi-Fi oppure un OEM potrebbe disattivare il Wi-Fi a favore di una rete mobile.

Preparati a gestire questi scenari nella tua app con un degradamento graduale della funzionalità che dipende dall'accesso a internet, ad esempio offrendo contenuti offline. Per saperne di più, consulta le best practice per l'ottimizzazione della rete.

Utilizzare risorse alternative

Per adattare la tua app alle auto, puoi utilizzare il qualificatore della risorsa car per fornire risorse alternative quando l'app viene eseguita su un veicolo con sistema operativo Android Automotive. Ad esempio, se utilizzi risorse dimensione per memorizzare valori di spaziatura interna, puoi utilizzare un valore più elevato per il set di risorse car per aumentare gli obiettivi di contatto.