Questa pagina spiega come le app possono passare agevolmente alla distrazione ottimizzate per le applicazioni. Descrive come consumare lo stato di guida di un'auto, nonché i limitazioni relative all'esperienza utente corrispondenti. Per ulteriori informazioni sulle limitazioni relative all'esperienza utente dell'auto, vedi Restrizioni relative all'esperienza utente delle auto, che descrive in dettaglio i tre stati di guida: Parcheggiato, Inattivo e In movimento.
Pubblico
Questi contenuti vengono forniti a coloro che desiderano progettare app che si adattino ai cambiamenti in un lo stato di guida dell'auto e le limitazioni UX imposte in modo appropriato.
Dettagli tecnici
Gestore dello Stato alla guida
Lo stato di guida di un'auto (Parcheggiato, In modalità Inattiva o In movimento) viene ricavato dai valori dei sensori forniti da Veicolo Hardware Abstraction Layer (VHAL). Informazioni di base dei sensori, ad esempio velocità del veicolo e selezione delle marce attuali, viene utilizzato per ricavare lo stato di guida attuale del veicolo.
CarDrivingStateEvent
.
che fornisce @SystemApis, il che significa che solo gli elementi interni della piattaforma e gli APK in bundle (come SysUI o
Impostazioni) e gli APK con privilegi (come) GMSCore possono accedere alle API. Le API sono protette
autorizzazioni specifiche per lo stato di guida android.car.permission.CAR_DRIVING_STATE
. Clienti
che richiedono l'accesso alle informazioni sullo stato di guida devono richiedere questa autorizzazione.
CarUxRestrictionsManager
Le app con un'interfaccia utente dipendente dallo stato di guida devono ascoltare
CarUxRestrictionsManager
,
che astrae la mappatura dallo stato di guida alle limitazioni UX, in modo che le app non debbano
adattarsi ai diversi requisiti di sicurezza del mercato.
Nota: queste attività devono essere contrassegnate come ottimizzato per le distrazioni, come descritto nelle linee guida sulla distrazione del conducente. Se le attività non vengono contrassegnate di conseguenza, vengono bloccate.
Le app monitorano invece le limitazioni esposte da CarUxRestrictionsManager e non stato di guida assoluto esposto da CarGuidaStateManager per qualsiasi aspetto relativo all'utente all'interfaccia o all'esperienza utente.
Esempio di codice
Il seguente codice di esempio illustra il modo in cui un'app monitora le limitazioni relative all'esperienza utente:
- Importa i pacchetti della raccolta dell'auto:
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
- Implementa
CarUxRestrictionManager.OnUxRestrictionsChangedListener
(mUxRChangeListener
). Questo listener, quando registrato con CarUxRestrictionsManager viene chiamato quando viene apportata una modifica alle limitazioni dell'esperienza utente. . Gestisci le modifiche alle limitazioni per ottimizzare le distrazioni, se necessario:@Nullable private CarUxRestrictionsManager mCarUxRestrictionsManager; private CarUxRestrictions mCurrentUxRestrictions; /* Implement the onUxRestrictionsChangedListener interface */ private CarUxRestrictionsManager.OnUxRestrictionsChangedListener mUxrChangeListener = new CarUxRestrictionsManager.OnUxRestrictionsChangedListener() { @Override public void onUxRestrictionsChanged(CarUxRestrictions carUxRestrictions) { mCurrentUxRestrictions = carUxRestrictions; /* Handle the new restrictions */ handleUxRestrictionsChanged(carUxRestrictions); } };
- Chiama le API car per creare un'istanza auto denominata mCar e connetterti al servizio auto:
mCar = Car.createCar(context); if (mCar == null) { // handle car connection error }
- Chiama
mCar.getCarManager() - mCarUxRestrictionsManager
per ricevereCarUxRestrictionsManager
:CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
- Per registrare l'elemento
mUxRChangeListener
implementato nel Passaggio 2 precedente con ilCarUxRestrictionsManager
chiamamCarUxRestrictionsManager.registerListener()
:mCarUxRestrictionsManager.registerListener(mUxrChangeListener); mUxrChangeListener.onUxRestrictionsChanged( mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
Il blocco completato di codice di esempio (creato dai passaggi da 3 a 5) genera nel listener ricezione di modifiche di restrizioni quando lo stato di Drive cambia:
mCar = Car.createCar(context); if (mCar == null) { // handle car connection error } CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE); mCarUxRestrictionsManager.registerListener(mUxrChangeListener); mUxrChangeListener.onUxRestrictionsChanged( mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
Restrizioni CarUx
L'oggetto CarUxRestrictions fornisce due tipi di informazioni:
- Esiste attualmente un requisito per l'ottimizzazione delle distrazioni?
- Se sì, quali limitazioni sono attualmente in vigore?
Quando CarUxRestrictions si ottiene da
getCurrentUxRestrictions()
o il callback dell'ascoltatore, le app ora possono usare
l'API isRequiresDistractionOptimization()
per determinare se
Ottimizzato
è obbligatorio. Se viene restituito false
, non è necessario richiedere distrazioni
ottimizzata e un'app può eseguire in sicurezza qualsiasi attività.
Se è necessaria l'ottimizzazione, utilizza l'API getActiveRestrictions() per ottenere l'insieme di limitazioni in atto. Questo
L'API restituisce un valore int, ovvero una maschera di bit di tutte le restrizioni attualmente in vigore. La
l'insieme di limitazioni attualmente notificate è elencato sotto CarUxRestrictions
.
Nota: sono previste modifiche di minore entità all'insieme di limitazioni. si verificheranno nel prossimo futuro.
Ad esempio, se un'app vuole stabilire se esiste una limitazione per la riproduzione di video, recuperando l'oggetto CarUxRestrictions, l'app deve verificare la presenza della limitazione:
int activeUxR = mCurrentCarUxRestrictions.getActiveRestrictions(); if ((activeUxR & CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO) != 0) { handleStopPlayingVideo(); }
Stato di guida
CarDrivingStateManager mostra l'effettivo stato di guida del veicolo (Parcheggiato, In attesa o in movimento). Le API CarGuidaStateManager possono essere chiamate in modo simile a CarUxRestrictionsManager. Le app possono registrare un listener o ottenere lo stato di guida corrente. Viene restituito lo stato di guida come CarDrivingStateEvent.
CarDrivingStateEvent
.
modifiche, il metodo onDrivingStateChanged()
viene chiamato con il nuovo
CarDrivingStateEvent
.
import android.car.Car; /* For CarDrivingState */ import android.car.drivingstate.CarDrivingStateEvent; import android.car.drivingstate.CarDrivingStateManager; mDrivingStateManager = (CarDrivingStateManager) mCar.getCarManager( Car.CAR_DRIVING_STATE_SERVICE); /* Register the listener (implemented below) */ mDrivingStateManager.registerListener(mDrivingStateEventListener); /* While we wait for a change to be notified, query the current state */ mDrivingStateEvent = mDrivingStateManager.getCurrentCarDrivingState(); private final CarDrivingStateManager.CarDrivingStateEventListener mDrivingStateEventListener = new CarDrivingStateManager.CarDrivingStateEventListener() { @Override public void onDrivingStateChanged(CarDrivingStateEvent event) { mDrivingStateEvent = event; /* handle the state change accordingly */ handleDrivingStateChange(); } };
Test
Per cambiare lo stato di guida, puoi simulare il cambio di marcia e di velocità. Utilizza una shell ADB per inserire eventi del veicolo. Questo può essere utile per lo sviluppo e il test.
Per simulare eventi di guida:
- Per impostare la velocità su 0:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- Per impostare la marcia su Parcheggiato (per simulare CarDrivingStateEvent che punta a PARKED):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
- Per impostare la marcia su Drive, con la velocità ancora a 0 (per simulare l'avvicinamento di CarDrivingStateEvent)
a IDLING):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
- Per impostare la velocità a 30 metri al secondo (per simulare CarDrivingStateEvent che punta a MOVING):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30