Verbrauchen Sie Autofahrstatus- und UX-Einschränkungen

Auf dieser Seite wird erläutert, wie Apps reibungslos auf ablenkungsoptimierte (DO) Benutzeroberflächen umgestellt werden können. Es beschreibt, wie der Fahrzustand eines Autos konsumiert wird, sowie die entsprechenden Einschränkungen beim Benutzererlebnis. Weitere Informationen zu UX-Einschränkungen (Car User Experience) finden Sie unter „Car User Experience Restrictions“ , in dem die drei Fahrzustände „Parken“, „Leerlauf“ und „In Bewegung“ detailliert beschrieben werden.

Publikum

Dieser Inhalt richtet sich an diejenigen, die Apps entwerfen möchten, die sich an Änderungen im Fahrzustand eines Autos und die entsprechend auferlegten UX-Einschränkungen anpassen.

Technische Details

CarDrivingStateManager

Der Fahrzustand eines Autos (geparkt, im Leerlauf oder in Bewegung) wird aus den Sensorwerten abgeleitet, die vom Vehicle Hardware Abstraction Layer (VHAL) bereitgestellt werden. Aus grundlegenden Sensorinformationen wie Fahrzeuggeschwindigkeit und aktueller Gangwahl wird der aktuelle Fahrzustand des Fahrzeugs abgeleitet.

CarDrivingStateEvent .

Dies stellt @SystemApis bereit, was bedeutet, dass nur Plattforminterna, gebündelte APKs (wie SysUI oder Einstellungen) und privilegierte APKs (wie GMSCore) auf die APIs zugreifen können. Die APIs sind durch fahrzustandsspezifische Berechtigungen android.car.permission.CAR_DRIVING_STATE geschützt. Kunden, die Zugriff auf Fahrstatusinformationen benötigen, müssen diese Erlaubnis beantragen.

CarUxRestrictionsManager

Apps, die eine vom Fahrzustand abhängige Benutzeroberfläche anzeigen, müssen auf CarUxRestrictionsManager hören, der die Zuordnung vom Fahrzustand zu UX-Einschränkungen abstrahiert, sodass sich Apps nicht an unterschiedliche Marktsicherheitsanforderungen anpassen müssen.

Hinweis : Diese Aktivitäten müssen als ablenkungsoptimiert gekennzeichnet sein, wie in den Richtlinien zur Fahrerablenkung beschrieben. Wenn die Aktivitäten nicht entsprechend gekennzeichnet sind, werden sie blockiert.

Stattdessen überwachen Apps die vom CarUxRestrictionsManager offengelegten Einschränkungen und nicht den vom CarDrivingStateManager offengelegten absoluten Fahrzustand für alles, was mit der Benutzeroberfläche oder dem Benutzererlebnis zusammenhängt.

Codebeispiel

Der folgende Beispielcode veranschaulicht, wie eine App UX-Einschränkungen überwacht:

  1. Importieren Sie die Autobibliothekspakete:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. Implementieren Sie CarUxRestrictionManager.OnUxRestrictionsChangedListener ( mUxRChangeListener ). Wenn dieser Listener beim CarUxRestrictionsManager registriert ist, wird er aufgerufen, wenn eine Änderung der UX-Einschränkungen auftritt. Behandeln Sie die Einschränkungsänderungen nach Bedarf so, dass sie ablenkungsoptimiert sind:
    @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. Rufen Sie die Auto-APIs auf, um eine Autoinstanz mit dem Namen mCar zu erstellen und eine Verbindung zum Autodienst herzustellen:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
    
  4. Rufen Sie mCar.getCarManager() - mCarUxRestrictionsManager auf, um den CarUxRestrictionsManager abzurufen:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. Um den in Schritt 2 oben implementierten mUxRChangeListener mit dem CarUxRestrictionsManager zu registrieren, rufen Sie mCarUxRestrictionsManager.registerListener() auf:
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Der abgeschlossene Beispielcodeblock (erstellt in Schritt 3 bis Schritt 5) führt dazu, dass der Listener Einschränkungsänderungen empfängt, wenn sich der Laufwerksstatus ändert:

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

Das CarUxRestrictions- Objekt stellt zwei Arten von Informationen bereit:

  1. Gibt es derzeit eine Anforderung zur Ablenkungsoptimierung?
  2. Wenn ja, welche Einschränkungen gelten derzeit?

Wenn CarUxRestrictions entweder von getCurrentUxRestrictions() oder dem Listener-Rückruf abgerufen wird, können Apps jetzt die API isRequiresDistractionOptimization() verwenden, um zu bestimmen, ob Distraction Optimized erforderlich ist. Wenn dies false zurückgibt, besteht keine Notwendigkeit, ablenkungsoptimiert zu sein, und eine App kann jede Aktivität sicher ausführen.

Wenn eine Optimierung erforderlich ist, verwenden Sie die API getActiveRestrictions() , um die vorhandenen Einschränkungen abzurufen. Diese API gibt einen int zurück, bei dem es sich um eine Bitmaske aller derzeit geltenden Einschränkungen handelt. Die derzeit gemeldeten Einschränkungen sind unter CarUxRestrictions aufgeführt.

Hinweis: Es wird erwartet, dass in naher Zukunft geringfügige Änderungen an den Beschränkungen vorgenommen werden.

Wenn eine App beispielsweise feststellen möchte, ob eine Einschränkung für die Videowiedergabe besteht, muss die App beim Abrufen des CarUxRestrictions-Objekts nach der Einschränkung suchen:

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

Fahrzustand

CarDrivingStateManager stellt den tatsächlichen Fahrzustand des Fahrzeugs dar (geparkt, im Leerlauf oder in Bewegung). CarDrivingStateManager-APIs können ähnlich wie der CarUxRestrictionsManager aufgerufen werden. Apps können einen Zuhörer registrieren oder den aktuellen Fahrstatus abrufen. Der Fahrzustand wird als CarDrivingStateEvent zurückgegeben.

CarDrivingStateEvent .

Bei Änderungen wird die Methode onDrivingStateChanged() mit dem neuen CarDrivingStateEvent aufgerufen.

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

Testen

Sie können den Gang- und Geschwindigkeitswechsel nachahmen, um den Fahrzustand zu ändern. Verwenden Sie einen ADB-Shell-Befehl, um Fahrzeugereignisse einzuschleusen. Dies kann eine nützliche Entwicklung und Prüfung sein.

So simulieren Sie Fahrereignisse:

  1. Um die Geschwindigkeit auf 0 zu setzen:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. Um den Gang auf „Geparkt“ zu setzen (um CarDrivingStateEvent zu simulieren, das auf „PARKED“ zeigt):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. Um den Gang auf „Fahren“ zu setzen, während die Geschwindigkeit immer noch bei 0 ist (um CarDrivingStateEvent zu simulieren, das auf IDLING zeigt):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
    
  4. So stellen Sie die Geschwindigkeit auf 30 Meter pro Sekunde ein (um CarDrivingStateEvent zu simulieren, das auf MOVING zeigt):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30