Przetwarzanie stanu jazdy samochodem i ograniczeń UX

Na tej stronie wyjaśniamy, jak aplikacje mogą płynnie przejść na interfejsy zoptymalizowane pod kątem braku rozpraszeń. Pokazuje, jak korzystać z danych dotyczących stanu jazdy samochodu, a także jakie ograniczenia wrażeń użytkownika się z tym wiążą. Więcej informacji o ograniczeniach związanych z wygodą korzystania z aplikacji w samochodzie znajdziesz w artykule Ograniczenia związane z wygodą korzystania z aplikacji w samochodzie, w którym omówiono 3 stany jazdy: zaparkowany, na biegu jałowym i w poruszaniu.

Odbiorcy

Te treści są przeznaczone dla osób, które chcą projektować aplikacje, które dostosowują się do zmian stanu jazdy samochodu i odpowiednio nakładanych ograniczeń UX.

Szczegóły techniczne

CarDrivingStateManager

Stan jazdy samochodu (zaparkowany, na biegu jałowym lub w ruchu) jest określany na podstawie wartości czujników udostępnianych przez warstwę abstrakcji sprzętu pojazdu (Vehicle Hardware Abstraction Layer, VHAL). Podstawowe informacje z czujników, takie jak prędkość pojazdu i obecnie wybrany bieg, są wykorzystywane do określenia bieżącego stanu jazdy.

CarDrivingStateEvent.

który udostępnia interfejsy API @SystemApis, co oznacza, że tylko wewnętrzne pakiety APK (np. SysUI lub Ustawienia) oraz uprzywilejowane pakiety APK (np. GMSCore) mogą uzyskać dostęp do interfejsów API. Interfejsy API są chronione przez uprawnienia dotyczące stanu jazdy android.car.permission.CAR_DRIVING_STATE. Klienci, którzy potrzebują dostępu do informacji o stanie jazdy, muszą poprosić o to o uprawnienia.

CarUxRestrictionsManager

Aplikacje, które wyświetlają interfejs użytkownika zależny od stanu jazdy, muszą odbierać zdarzenia CarUxRestrictionsManager, które abstrakcyjnie mapują stan jazdy na ograniczenia UX, dzięki czemu aplikacje nie muszą dostosowywać się do różnych wymagań dotyczących bezpieczeństwa na poszczególnych rynkach.

Uwaga: te czynności muszą być oznaczone jako zoptymalizowane pod kątem rozpraszania uwagi, zgodnie z opisem w wytycznych dotyczących rozpraszania uwagi kierowcy. Jeśli nie są odpowiednio oznaczone, są blokowane.

Zamiast tego aplikacje monitorują ograniczenia udostępniane przez CarUxRestrictionsManager, a nie stan jazdy udostępniany przez CarDrivingStateManager w przypadku wszystkich elementów interfejsu użytkownika lub związanych z wygodą użytkownika.

Przykładowy kod

Poniższy przykładowy kod pokazuje, jak aplikacja monitoruje ograniczenia UX:

  1. Zaimportuj pakiety biblioteki samochodów:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
  2. Zaimplementuj CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener). Ten odbiorca, gdy zostanie zarejestrowany w CarUxRestrictionsManager, jest wywoływany, gdy nastąpi zmiana ograniczeń UX. W razie potrzeby zmień ograniczenia, aby zoptymalizować ograniczenie rozpraszania uwagi:
    @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. Wywołaj interfejsy API samochodu, aby utworzyć instancję samochodu o nazwie mCar i połączyć się z usługą samochodu:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
  4. Zadzwoń pod numer mCar.getCarManager() - mCarUxRestrictionsManager, aby uzyskać informacje o CarUxRestrictionsManager:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
  5. Aby zarejestrować mUxRChangeListener zaimplementowane w kroku 2 za pomocą wywołania CarUxRestrictionsManager:mCarUxRestrictionsManager.registerListener()
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

Ukończony blok przykładowego kodu (utworzonego w kroku 3–5) powoduje, że listener otrzymuje zmiany ograniczeń, gdy zmienia się stan jazdy:

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

Obiekt CarUxRestrictions zawiera 2 rodzaje informacji:

  1. Czy obecnie obowiązuje wymóg optymalizacji pod kątem rozpraszających elementów?
  2. Jeśli tak, jakie ograniczenia są obecnie obowiązujące?

Gdy CarUxRestrictions zostanie uzyskana z getCurrentUxRestrictions() lub z wywołania zwrotnego listenera, aplikacje mogą używać interfejsu API isRequiresDistractionOptimization(), aby określić, czy wymagane jest zoptymalizowanie pod kątem braku rozpraszeń. Jeśli zwróci wartość false, nie musisz optymalizować aplikacji pod kątem rozpraszania uwagi i możesz bezpiecznie uruchamiać w niej dowolną aktywność.

Jeśli wymagana jest optymalizacja, użyj interfejsu API getActiveRestrictions(), aby uzyskać zestaw obowiązujących ograniczeń. Ta usługa API zwraca wartość int, która jest maską bitową wszystkich ograniczeń obecnie w obowiązku. Zestaw ograniczeń, o których powiadomiono, jest wymieniony w sekcji CarUxRestrictions.

Uwaga: w najbliższej przyszłości planujemy wprowadzić drobne zmiany w zestawie ograniczeń.

Jeśli na przykład aplikacja chce określić, czy istnieje ograniczenie odtwarzania filmów, po uzyskaniu obiektu CarUxRestrictions aplikacja musi sprawdzić, czy istnieje ograniczenie:

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

DrivingState

CarDrivingStateManager przedstawia rzeczywisty stan jazdy pojazdu (zaparkowany, na biegu jałowym lub w ruchu). Interfejsy API CarDrivingStateManager można wywoływać podobnie jak interfejs CarUxRestrictionsManager. Aplikacje mogą rejestrować słuchacza lub uzyskiwać informacje o jego aktualnym stanie jazdy. Stan jazdy jest zwracany jako CarDrivingStateEvent.

CarDrivingStateEvent.

zmiany, metoda onDrivingStateChanged() jest wywoływana z nowym parametrem 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();
   }
};

Testowanie

Aby zmienić stan jazdy, możesz symulować zmianę biegów i prędkości. Użyj polecenia ADB shell, aby wstrzyknąć zdarzenia związane z pojazdem. Może to być przydatne podczas programowania i testowania.

Aby symulować zdarzenia związane z prowadzeniem pojazdu:

  1. Aby ustawić prędkość na 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
  2. Aby ustawić bieg na „Zaparkowany” (aby symulować zdarzenie CarDrivingStateEvent wskazujące PARKED):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
  3. Aby ustawić bieg na „Jazda”, a prędkość na 0 (aby symulować CarDrivingStateEvent wskazujący na IDLING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
  4. Aby ustawić prędkość na 30 metrów na sekundę (aby symulować zdarzenie CarDrivingStateEvent wskazujące MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30