Einschränkungen für Fahrstatus und Nutzererfahrung des Autos berücksichtigen

Auf dieser Seite wird erläutert, wie Apps reibungslos zur Ablenkung übergehen können. optimierten Benutzeroberflächen. Sie beschreibt, wie der Fahrzustand und die die entsprechenden Einschränkungen der Nutzererfahrung entsprechen. Weitere Informationen zu Einschränkungen für die Autonutzung findest du unter Einschränkungen für die Autonutzung Dort sind die drei Fahrstatus „Geparkt“, „Inaktiv“ und „In Bewegung“ aufgeführt.

Zielgruppe

Diese Inhalte richten sich an alle, die Apps entwerfen möchten, die sich an Veränderungen in einem den Fahrstatus des Autos und die entsprechenden UX-Einschränkungen.

Technische Details

CarDrivingState-Manager

Der Fahrstatus eines Autos (geparkt, inaktiv oder in Bewegung) wird aus den Sensorwerten abgeleitet, die von der Fahrzeughardware-Abstraktionsschicht (Vehicle Hardware Abstraktionsschicht, VHAL). Grundlegende Sensorinformationen wie die Fahrzeuggeschwindigkeit und die aktuelle Gangauswahl, wird verwendet, um den aktuellen Fahrstatus des Fahrzeugs abzuleiten.

CarDrivingStateEvent.

mit @SystemApis, was bedeutet, dass nur Plattform-interne Dateien, gebündelte APKs (wie SysUI oder Einstellungen) und privilegierte APKs (z. B. GMSCore) auf die APIs zugreifen können. Die APIs sind geschützt durch Berechtigungen speziell für den Fahrstatus „android.car.permission.CAR_DRIVING_STATE“. 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, die die Zuordnung vom Fahrstatus zu den UX-Einschränkungen abstrahiert, damit Apps nicht Anforderungen an die Marktsicherheit anpassen.

Hinweis: Diese Aktivitäten müssen als Ablenkung optimiert, wie beschrieben in den Richtlinien zur Ablenkung von Autofahrern. Wenn die Aktivitäten nicht entsprechend markiert sind, werden sie blockiert.

Stattdessen überwachen Apps die Einschränkungen, die vom CarUxRestrictionsManager und nicht von einem absoluten Fahrstatus, der vom CarDrivingStateManager für alle Informationen zum Nutzer bereitgestellt wird oder die User Experience.

Codebeispiel

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

  1. Importieren Sie die Pakete der Autobibliothek:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. CarUxRestrictionManager.OnUxRestrictionsChangedListener implementieren (mUxRChangeListener) Dieser Listener, wenn er beim CarUxRestrictionsManager wird aufgerufen, wenn eine Änderung an den UX-Einschränkungen erfolgt. Gehen Sie bei Bedarf so um, dass die Änderungen der Einschränkung für eine optimale Ablenkung sorgen:
    @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 namens 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 an, um CarUxRestrictionsManager:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. So registrieren Sie mUxRChangeListener, die in Schritt 2 oben implementiert ist, mit dem Anruf von CarUxRestrictionsManager mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Der ausgefüllte Beispielcode-Block, der in den Schritten 3 bis 5 erstellt wurde, führt im Listener zum Ergebnis. Beschränkungsänderungen erhalten, wenn sich der Laufwerkstatus ä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());

CarUx-Einschränkungen

Das Objekt CarUxRestrictions stellt zwei Arten von Informationen bereit:

  1. Muss die Ablenkung optimiert werden?
  2. Wenn ja, welche Einschränkungen gelten derzeit?

Wenn CarUxRestrictions entweder von getCurrentUxRestrictions() oder den Listener-Callback verwenden können, können Apps isRequiresDistractionOptimization()-API, um festzustellen, ob eine Ablenkung Optimiert ist erforderlich. Wenn der Wert false zurückgegeben wird, muss kein Ablenkung erfolgen. Optimiert und eine App kann jede Aktivität sicher ausführen.

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

Hinweis:Kleinere Änderungen an den Einschränkungen in naher Zukunft.

Wenn eine App beispielsweise feststellen möchte, ob die Wiedergabe von Videos eingeschränkt ist, Wenn das Objekt "CarUxRestrictions" abgerufen wird, muss die App die Einschränkung überprüfen:

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

Fahrstatus

CarDrivingStateManager zeigt den tatsächlichen Fahrstatus des Fahrzeugs an (geparkt, inaktiv oder Wird verschoben). CarDrivingStateManager-APIs können ähnlich wie CarUxRestrictionsManager aufgerufen werden. Apps können einen Listener registrieren oder den aktuellen Fahrstatus abrufen. Der Fahrstatus wird zurückgegeben, als „CarDrivingStateEvent“.

CarDrivingStateEvent.

wird die Methode onDrivingStateChanged() mit dem neuen 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();
   }
};

Testen

Sie können den Wechsel der Gangschaltung und die Geschwindigkeit nachahmen, um den Fahrzustand zu ändern. ADB-Shell verwenden um Fahrzeugereignisse einzufügen. Dies kann bei der Entwicklung und beim Testen hilfreich sein.

So simulieren Sie Fahrereignisse:

  1. So stellen Sie die Geschwindigkeit auf 0 ein:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. So stellen Sie das Zahnrad auf „Geparkt“ ein, um ein CarDrivingStateEvent-Element zu simulieren, das auf GEPARKT verweist:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. Zum Einstellen des Gangs auf Drive, wobei die Geschwindigkeit immer noch auf 0 steht (um den Zeigevorgang von CarDrivingStateEvent zu simulieren) an IDLING):
    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 ein CarDrivingStateEvent-Ereignis für MOVING zu simulieren:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30