Fahrzustand des Autos und UX-Einschränkungen nutzen

Auf dieser Seite wird beschrieben, wie Apps nahtlos zu bestmöglich ablenkungsfreien Benutzeroberflächen (distraction-optimized, DO) wechseln können. Es wird beschrieben, wie der Fahrstatus eines Autos abgerufen wird, sowie die entsprechenden Einschränkungen für die Nutzererfahrung. Weitere Informationen zu Einschränkungen bei der Nutzererfahrung im Auto finden Sie unter Einschränkungen bei der Nutzererfahrung im Auto. Dort werden die drei Fahrzustände „Geparkt“, „Leerlauf“ und „In Bewegung“ beschrieben.

Zielgruppe

Diese Inhalte richten sich an Entwickler, die Apps entwerfen möchten, die sich an Änderungen des Fahrzustands eines Autos und die entsprechenden UX-Einschränkungen anpassen.

Technische Details

CarDrivingStateManager

Der Fahrstatus eines Autos (Geparkt, Leerlauf oder In Bewegung) wird aus den Sensorwerten der Vehicle Hardware Abstraction Layer (VHAL) abgeleitet. Anhand grundlegender Sensorinformationen wie der Fahrzeuggeschwindigkeit und der aktuellen Gangwahl wird der aktuelle Fahrzustand des Fahrzeugs ermittelt.

CarDrivingStateEvent.

Dieser bietet @SystemApis, sodass nur Plattforminterne, gebundelte APKs (z. B. SysUI oder Einstellungen) und privilegierte APKs (z. B. GMSCore) auf die APIs zugreifen können. Die APIs sind durch Berechtigungen geschützt, die für den Status android.car.permission.CAR_DRIVING_STATE gelten. Kunden, die Zugriff auf Informationen zum Fahrstatus benötigen, müssen diese Berechtigung anfordern.

CarUxRestrictionsManager

Apps, die eine vom Fahrstatus abhängige Benutzeroberfläche anzeigen, müssen CarUxRestrictionsManager verarbeiten. Dadurch wird die Zuordnung des Fahrstatus zu UX-Einschränkungen abstrahiert, sodass Apps nicht an unterschiedliche Sicherheitsanforderungen in verschiedenen Märkten angepasst werden müssen.

Hinweis: Diese Aktivitäten müssen gemäß den Richtlinien zu Ablenkungen für Fahrer als ablenkungsoptimiert gekennzeichnet sein. Wenn die Aktivitäten nicht entsprechend gekennzeichnet sind, werden sie blockiert.

Stattdessen überwachen Apps Einschränkungen, die vom CarUxRestrictionsManager freigegeben werden, und nicht den absoluten Fahrstatus, der vom CarDrivingStateManager freigegeben wird, für alles, was sich auf die Benutzeroberfläche oder die Nutzererfahrung bezieht.

Codebeispiel

Im folgenden Beispielcode wird veranschaulicht, wie eine App UX-Einschränkungen überwacht:

  1. Importieren Sie die Pakete der Fahrzeugbibliothek:
    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 sich die UX-Einschränkungen ändern. Passen Sie die Einschränkungen nach Bedarf an, um Ablenkungen zu minimieren:
    @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 die CarUxRestrictionsManager abzurufen:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
  5. So registrierst du mUxRChangeListener, das in Schritt 2 oben implementiert wurde, mit dem CarUxRestrictionsManager-Aufruf mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

Durch den vollständigen Codeblock (in Schritt 3 bis Schritt 5 erstellt) erhält der Listener Einschränkungen, wenn sich der Status des Laufwerks ä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 Objekt CarUxRestrictions enthält zwei Arten von Informationen:

  1. Gibt es derzeit eine Anforderung, dass Inhalte frei von Ablenkungen sein müssen?
  2. Falls ja, welche Einschränkungen gelten derzeit?

Wenn CarUxRestrictions entweder über getCurrentUxRestrictions() oder den Listener-Callback abgerufen wird, können Apps jetzt über die isRequiresDistractionOptimization() API feststellen, ob die Funktion „Für Ablenkungen optimiert“ erforderlich ist. Wenn false zurückgegeben wird, ist keine Optimierung für Ablenkungen erforderlich und eine App kann alle Aktivitäten sicher ausführen.

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

Hinweis:In naher Zukunft werden voraussichtlich geringfügige Änderungen an den Einschränkungen vorgenommen.

Wenn eine App beispielsweise feststellen möchte, ob eine Einschränkung für die Wiedergabe von Videos vorliegt, muss sie nach dem Abrufen des CarUxRestrictions-Objekts nach der Einschränkung suchen:

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

DrivingState

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

CarDrivingStateEvent.

ändert, 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 das Schalten und die Geschwindigkeit nachahmen, um den Fahrzustand zu ändern. Verwenden Sie einen ADB-Shell-Befehl, um Fahrzeugereignisse einzuschleusen. Das kann bei der Entwicklung und beim Testen hilfreich sein.

So simulieren Sie Fahrten:

  1. So legen Sie die Geschwindigkeit auf 0 fest:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
  2. So legen Sie den Gang auf „Parken“ fest, um zu simulieren, dass das CarDrivingStateEvent auf „PARKED“ verweist:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
  3. So stellen Sie den Gang auf „D“, während die Geschwindigkeit bei 0 bleibt (um zu simulieren, dass das CarDrivingStateEvent auf „AUSGEKUPPELT“ verweist):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
  4. So legen Sie die Geschwindigkeit auf 30 Meter pro Sekunde fest, um zu simulieren, dass das CarDrivingStateEvent auf MOVING verweist:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30