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:
- Per le app video, consulta Contrassegnare l'app come app video.
- Per i giochi, vedi Contrassegnare l'app come gioco.
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:
- Installa l'app su un'immagine di sistema senza il Google Play Store o la modalità di compatibilità.
- Con la griglia dell'app Avvio app aperta, simula la guida e verifica che l'app non possa essere aperta.
- Interrompi la simulazione della guida e apri l'app su una schermata di riproduzione e avvia la riproduzione.
- Simula di nuovo la guida e verifica che la riproduzione si interrompa.
- Se la tua app supporta l'integrazione con
MediaSession, utilizzaadb shell cmd media_session dispatch playe verifica che la riproduzione non riprenda.
- Se la tua app supporta l'integrazione con
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:
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.