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

Quando distribuisci la tua app sui dispositivi Android Automotive OS, ci sono alcune considerazioni specifiche per il fattore di forma di cui devi essere a conoscenza. Questa guida spiega questi aspetti.

Testare l'app esistente su un emulatore Android Automotive OS

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

Quando esegui l'app, verifica la presenza di problemi di compatibilità, ad esempio i seguenti:

  • 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 informazioni dettagliate su come gestire questi problemi.

Configura il file manifest dell'app

Per avere come target i dispositivi Android Automotive OS, la tua app deve avere determinate voci del file manifest. Dopo aver attivato la distribuzione ai dispositivi Android Automotive OS, Google Play esamina le app compatibili per assicurarsi che siano sicure da usare in auto. Per ulteriori dettagli, consulta la sezione Distribuire app alle auto.

Funzionalità di Android Automotive OS richieste

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.

Voci del 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 parcheggiate, questo obiettivo viene raggiunto principalmente impedendo l'utilizzo o la riproduzione di audio da parte dell'app mentre sono attive le limitazioni dell'esperienza utente (UX), come indicato dalle linee guida per la qualità DD-2 e DD-3.

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

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

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

Se un'attività nella tua app viene Ripresa quando le limitazioni UX diventano attive, viene oscurata da un'attività di proprietà del sistema operativo.

Come minimo, le transizioni di attività della tua app allo stato del ciclo di vita Paused. Ciò si verifica come callback del ciclo di vita onPause durante il quale devi mettere in pausa la riproduzione di video e audio dalla tua app.

Sui dispositivi che includono la modalità di compatibilità con Android Automotive OS, il blocco del sistema fa sì che le attività della tua app passino dallo stato In pausa allo stato Arrestato.

Interrompi la riproduzione e impedisci la ripresa della riproduzione

Per alcune app, mettere in pausa la riproduzione durante onPause() e tenere traccia dello stato per impedire la ripresa della riproduzione fino al giorno onResume() è sufficiente per soddisfare i requisiti relativi alla distrazione del conducente.

Se reagire ai callback del ciclo di vita non è sufficiente per la tua app, puoi ascoltare lo stato di limitazione dell'esperienza utente direttamente come descritto nella sezione seguente. Ad esempio, le app che supportano la modalità Picture in picture potrebbero preferire ascoltare direttamente anziché eseguire controlli condizionali nei callback del ciclo di vita.

Ascolta le limitazioni dell'esperienza utente

Per ascoltare le limitazioni dell'esperienza utente, aggiungi prima una dipendenza dalla libreria 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 di limitazione dell'esperienza utente da un altro stato hardware come marcia o velocità, perché le limitazioni dell'esperienza utente possono variare da un display all'altro all'interno di un veicolo.

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

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

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

// 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 fa riferimento la tua app è il valore restituito di isRequiresDistractionOptimization. Gli altri valori sono pertinenti solo per le attività contrassegnate come ottimizzate per la distrazione.

Testare l'implementazione

Verifica che la tua app soddisfi i requisiti di distrazione del conducente utilizzando la procedura seguente:

  1. Installa l'app su un'immagine di sistema senza il Google Play Store o la modalità di compatibilità.
  2. Con la griglia dell'app Avvio app aperta, simula la guida e verifica che l'app non possa essere aperta.
  3. Interrompi la simulazione della guida e apri l'app su una schermata di riproduzione e avvia la riproduzione.
  4. Simula di nuovo la guida e verifica che la riproduzione si interrompa.
    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 ai tuoi utenti la migliore esperienza possibile in auto, tieni presente quanto segue durante la creazione della tua app per Android Automotive OS:

Utilizzare i rientri della finestra e i ritagli del display

Come per altri fattori di forma, Android Automotive OS include elementi dell'interfaccia utente di sistema, come le 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 nella tua app, disegnare i contenuti dietro di esse o mostrare i contenuti in un ritaglio display come descritto in Disporre l'app all'interno degli inset della finestra. Se la tua app esegue una di queste operazioni, consulta le seguenti sottosezioni per informazioni dettagliate su come far funzionare correttamente la tua app 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 posizioni diverse rispetto ad altri formati. Ad esempio, le barre di navigazione possono essere posizionate a sinistra, a destra o in basso dello schermo. Anche nel caso in cui siano presenti una barra di stato in alto e una barra di navigazione in basso (come nella maggior parte degli smartphone e dei tablet), le dimensioni di questi elementi saranno probabilmente molto maggiori nelle auto.

Inoltre, Android Automotive OS consente agli OEM di controllare se le app possono mostrare o nascondere le barre di sistema per entrare e uscire dalla modalità immersiva. Ad esempio, impedendo alle app di nascondere le barre di sistema, gli OEM possono garantire che i controlli del veicolo, come quelli del climatizzatore, 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 inset.

Allo stesso modo, gli OEM possono anche controllare se le app possono impostare il colore e la traslucenza delle barre di sistema per garantire che le barre e gli elementi contenuti al loro interno siano sempre chiaramente visibili. Se la tua app viene visualizzata da bordo a bordo, verifica che solo i contenuti non critici vengano visualizzati dietro le barre di sistema. Questi contenuti potrebbero non essere visibili se l'OEM del dispositivo impedisce l'impostazione del colore o della traslucenza 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 si estende da un bordo all'altro, non fare ipotesi su dimensioni, numero, tipo o posizione delle barre di sistema. Utilizza invece le API per gli inset delle finestre per disporre i contenuti dell'app rispetto alle barre di sistema. Per ulteriori dettagli su come utilizzare queste API, consulta Visualizzare i contenuti edge-to-edge nell'app. I valori di spaziatura interna codificati non sono mai consigliati per nessun fattore di forma, ma nelle auto probabilmente non funzioneranno per mantenere i contenuti nell'area sicura.

Adattarsi a display di forma irregolare

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

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

Se la tua app non viene visualizzata da bordo a bordo, non devi fare nulla per visualizzarla all'interno dell'area sicura.

Se il rendering della tua app viene eseguito edge-to-edge, puoi scegliere come vuoi che si comporti rispetto ai fori del display. Puoi farlo utilizzando le risorse impostando l'attributo android:windowLayoutInDisplayCutoutMode per il tema della tua app o in fase di runtime modificando l'attributo layoutInDisplayCutoutMode della finestra.

Poiché i tipi di ritagli del display presenti sui dispositivi Android Automotive OS 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 o inserire sempre il ritaglio. Se scegli quest'ultima opzione, consulta la sezione Supportare le interruzioni del display per ulteriori dettagli sulle API correlate alle interruzioni del display.

Se il rendering della tua app viene eseguito nell'area di ritaglio display e vuoi un comportamento diverso tra Android Automotive OS e il dispositivo mobile, consulta Disattivare le funzionalità per indicazioni se la tua app imposta questo comportamento in fase di runtime e Utilizzare risorse alternative se la tua app imposta questo comportamento utilizzando i file di risorse.

Disabilita 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, su Android Automotive OS è disponibile solo un sottoinsieme di Google Play Services. Per ulteriori dettagli, consulta Google Play Services per le 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:

val 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 consolidate per verificare se la funzionalità è disponibile e reagire di conseguenza.

Gestire scenari offline

Sebbene le auto siano 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 dal produttore dell'auto.
  • L'accesso ai dati mobili potrebbe essere limitato in alcune aree.
  • Le auto con radio Wi-Fi potrebbero essere fuori dalla portata del Wi-Fi oppure un OEM potrebbe disattivare il Wi-Fi a favore di una rete mobile.

Prepara la tua app a gestire questi scenari riducendo gradualmente la funzionalità che dipende dall'accesso a internet, ad esempio offrendo contenuti offline. Per saperne di più, consulta le best practice per l'ottimizzazione del networking.

Utilizzare risorse alternative

Per adattare più facilmente la tua app alle auto, puoi utilizzare il carqualificatore delle risorse per fornire risorse alternative quando l'app viene eseguita su un veicolo con Android Automotive OS. Ad esempio, se utilizzi Risorse di dimensioni per memorizzare i valori di spaziatura interna, potresti utilizzare un valore più grande per il set di risorse car per rendere più grandi i target di tocco.