Rispetta le limitazioni relative allo stato di guida e all'UX

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:

  1. Importa i pacchetti della raccolta dell'auto:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
  2. 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);
            }
        };
      
  3. 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
    }
  4. Chiama mCar.getCarManager() - mCarUxRestrictionsManager per ricevere CarUxRestrictionsManager:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
  5. Per registrare l'elemento mUxRChangeListener implementato nel Passaggio 2 precedente con il CarUxRestrictionsManager chiama mCarUxRestrictionsManager.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:

  1. Esiste attualmente un requisito per l'ottimizzazione delle distrazioni?
  2. 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:

  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 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
  4. 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