Consumo dello stato di guida dell'auto e restrizioni UX

Questa pagina spiega come le app possono passare agevolmente alle interfacce utente ottimizzate per la distrazione (DO). Descrive come utilizzare lo stato di guida di un'auto e le corrispondenti restrizioni sull'esperienza dell'utente. Per ulteriori informazioni sulle restrizioni dell'esperienza utente dell'auto (UX), consulta Restrizioni dell'esperienza utente dell'auto , che descrive in dettaglio i tre stati di guida Parcheggiato, Inattivo e In movimento.

Pubblico

Questo contenuto è fornito a coloro che desiderano progettare app che si adattino ai cambiamenti nello stato di guida di un'auto e alle restrizioni UX imposte di conseguenza.

Dettagli tecnici

CarDrivingStateManager

Lo stato di guida di un'auto (parcheggiata, inattiva o in movimento) deriva dai valori dei sensori forniti dal Vehicle Hardware Abstraction Layer (VHAL). Le informazioni di base del sensore, come la velocità del veicolo e la selezione della marcia attuale, vengono utilizzate per ricavare lo stato di guida attuale del veicolo.

CarDrivingStateEvent .

che fornisce @SystemApis, il che significa che solo i componenti interni della piattaforma, gli APK in bundle (come SysUI o Impostazioni) e gli APK privilegiati (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.

Gestore restrizioni CarUx

Quelle app che visualizzano un'interfaccia utente dipendente dallo stato di guida devono ascoltare CarUxRestrictionsManager , che astrae la mappatura dallo stato di guida alle restrizioni UX in modo che le app non debbano adattarsi ai diversi requisiti di sicurezza del mercato.

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

Invece, le app monitorano le restrizioni esposte da CarUxRestrictionsManager e non uno stato di guida assoluto esposto da CarDrivingStateManager per qualsiasi cosa relativa all'interfaccia utente o all'esperienza dell'utente.

Esempio di codice

Il seguente codice di esempio illustra il modo in cui un'app monitora le restrizioni UX:

  1. Importa i pacchetti della libreria auto:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. Implementare CarUxRestrictionManager.OnUxRestrictionsChangedListener ( mUxRChangeListener ). Questo ascoltatore, quando registrato con CarUxRestrictionsManager , viene chiamato quando si verifica una modifica nelle restrizioni UX. Gestisci le modifiche alle restrizioni per ottimizzare la distrazione, secondo necessità:
    @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 dell'auto per creare un'istanza dell'auto denominata mCar e connetterti al servizio auto:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
    
  4. Chiama mCar.getCarManager() - mCarUxRestrictionsManager per ottenere CarUxRestrictionsManager :
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. Per registrare mUxRChangeListener implementato nel passaggio 2 sopra con CarUxRestrictionsManager chiamare mCarUxRestrictionsManager.registerListener() :
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Il blocco completato di codice di esempio (creato dal Passaggio 3 al Passaggio 5) fa sì che l'ascoltatore riceva modifiche alle restrizioni quando cambia lo stato dell'unità:

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:

  1. Esiste un requisito attuale per ottimizzare la distrazione?
  2. Se sì, quali restrizioni sono attualmente in vigore?

Quando CarUxRestrictions viene ottenuto da getCurrentUxRestrictions() o dal callback del listener, le app ora possono utilizzare l'API isRequiresDistractionOptimization() per determinare se è richiesto Distraction Optimized. Se restituisce false , non è necessario che sia ottimizzata per la distrazione e un'app può eseguire in sicurezza qualsiasi attività.

Se è necessaria l'ottimizzazione, utilizzare l'API getActiveRestrictions() per ottenere l'insieme di restrizioni in atto. Questa API restituisce un int , che è una maschera di bit di tutte le restrizioni attualmente in vigore. L'insieme di restrizioni attualmente notificate è elencato in CarUxRestrictions .

Nota: si prevede che nel prossimo futuro verranno apportate modifiche minori all'insieme di restrizioni.

Ad esempio, se un'app desidera determinare se esiste una restrizione per la riproduzione di video, dopo aver ottenuto l'oggetto CarUxRestrictions, l'app deve verificare la restrizione:

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

Stato di guida

CarDrivingStateManager presenta 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 ascoltatore o ottenere lo stato di guida attuale. Lo stato di guida viene restituito 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

Puoi imitare il cambio di marcia e la velocità per cambiare lo stato di guida. Utilizza un comando shell ADB per inserire eventi del veicolo. Questo può essere utile per lo sviluppo e il test.

Per simulare 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 Parcheggiato (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 Guida, 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