Utilizza lo stato di guida dell'auto e le limitazioni dell'esperienza utente

Questa pagina spiega come le app possono passare gradualmente a interfacce utente ottimizzate per ridurre le distrazioni (DO). Descrive come utilizzare lo stato di guida di un'auto e le limitazioni dell'esperienza utente corrispondenti. Per saperne di più sulle limitazioni dell'esperienza utente (UX) dell'auto, consulta Limitazioni dell'esperienza utente dell'auto, che descrive in dettaglio i tre stati di guida Parcheggiata, Inattivo e In movimento.

Pubblico

Questi contenuti sono forniti per chi vuole progettare app che si adattano alle variazioni dello stato di guida di un'auto e alle limitazioni dell'esperienza utente imposte di conseguenza.

Dettagli tecnici

CarDrivingStateManager

Lo stato di guida di un'auto (Parcheggiato, Inattivo o In movimento) è dedotto dai valori dei sensori forniti dal VHAL (Vehicle Hardware Abstraction Layer). Le informazioni di base dei sensori, come la velocità del veicolo e la selezione dell'attuale marcia, vengono utilizzate per dedurre lo stato di guida corrente del veicolo.

CarDrivingStateEvent.

che fornisce @SystemApis, il che significa che solo le app interne alla piattaforma, gli APK in bundle (come SysUI o Settings) e gli APK con privilegi (come GMSCore) possono accedere alle API. Le API sono protette da autorizzazioni specifiche per lo stato di guida android.car.permission.CAR_DRIVING_STATE. I clienti che richiedono l'accesso alle informazioni sullo stato di guida devono richiedere questa autorizzazione.

CarUxRestrictionsManager

Le app che mostrano un'interfaccia utente dipendente dallo stato di guida devono ascoltare CarUxRestrictionsManager, che esegue l'astrazione della mappatura dallo stato di guida alle limitazioni dell'esperienza utente in modo che le app non debbano essere adattate ai diversi requisiti di sicurezza del mercato.

Nota: queste attività devono essere contrassegnate come ottimizzate per la guida senza distrazioni, come descritto nelle linee guida sulla distrazione alla guida. Se le attività non sono contrassegnate di conseguenza, vengono bloccate.

Le app monitorano invece le limitazioni esposte da CarUxRestrictionsManager e non uno stato di guida assoluto esposto da CarDrivingStateManager per qualsiasi elemento correlato all'interfaccia utente o all'esperienza utente.

Esempio di codice

Il seguente codice di esempio illustra come un'app monitora le limitazioni dell'esperienza utente:

  1. Importa i pacchetti della libreria di auto:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
  2. Implementa CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener). Questo listener, se registrato con CarUxRestrictionsManager, viene chiamato quando si verifica una modifica delle limitazioni UX. Gestisci le modifiche alle limitazioni per ottimizzare la funzionalità di eliminazione delle 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);
            }
        };
      
  3. Chiama le API di auto per creare un'istanza di auto denominata mCar e connettiti al servizio di auto:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
  4. Chiama mCar.getCarManager() - mCarUxRestrictionsManager per ricevere il CarUxRestrictionsManager:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
  5. Per registrare mUxRChangeListener implementato nel passaggio 2 precedente con la chiamata CarUxRestrictionsManager mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

Il blocco di codice di esempio completato (creato dal passaggio 3 al passaggio 5) fa sì che l'ascoltatore riceva le modifiche alle limitazioni quando cambia lo stato di guida:

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());

CarUxRestrictions

L'oggetto CarUxRestrictions fornisce due tipi di informazioni:

  1. Esiste un requisito attuale per l'ottimizzazione per evitare distrazioni?
  2. In caso affermativo, quali limitazioni sono attualmente in vigore?

Quando CarUxRestrictions viene ottenuto da getCurrentUxRestrictions() o dal callback dell'ascoltatore, ora le app possono utilizzare l'API isRequiresDistractionOptimization() per determinare se è richiesta la funzionalità Ottimizzazione per la guida con distrazioni. Se viene restituito false, non è necessario ottimizzare l'app per la guida senza distrazioni e l'app può eseguire in sicurezza qualsiasi attività.

Se è necessaria l'ottimizzazione, utilizza l'API getActiveRestrictions() per ottenere l'insieme di restrizioni in vigore. Questa API restituisce un valore int, ovvero una maschera di bit di tutte le limitazioni attualmente in vigore. L'insieme di limitazioni attualmente comunicate è elencato in CarUxRestrictions.

Nota:nel prossimo futuro sono previste piccole modifiche all'insieme di limitazioni.

Ad esempio, se un'app vuole determinare se esiste una limitazione per la riproduzione di video, al momento dell'ottenimento dell'oggetto CarUxRestrictions deve verificare la presenza della limitazione:

int activeUxR = mCurrentCarUxRestrictions.getActiveRestrictions();
if ((activeUxR & CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO) != 0) {
      handleStopPlayingVideo();
}

DrivingState

CarDrivingStateManager mostra lo stato di guida effettivo del veicolo (Parcheggiato, Inattivo o in movimento). Le API CarDrivingStateManager possono essere chiamate in modo simile a CarUxRestrictionsManager. Le app possono registrare un listener o ottenere lo stato di guida corrente. Lo stato di guida viene restituito come CarDrivingStateEvent.

CarDrivingStateEvent.

cambia, 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

Puoi simulare il cambio di marcia e la velocità per modificare lo stato di guida. Utilizza un comando ADB shell per iniettare gli eventi relativi ai veicoli. Ciò può essere utile per lo sviluppo e il testing.

Per simulare gli eventi di guida:

  1. Per impostare la velocità su 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
  2. Per impostare la marcia su Parcheggiata (per simulare CarDrivingStateEvent che punta a PARKED):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
  3. Per impostare la marcia su Drive, con la velocità ancora a 0 (per simulare CarDrivingStateEvent che punta a IDLING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
  4. Per impostare la velocità su 30 metri al secondo (per simulare CarDrivingStateEvent che punta a MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30