Stan jazdy samochodu i ograniczenia UX

Na tej stronie wyjaśniamy, jak aplikacje mogą płynnie przejść w czas, który Cię rozprasza. zoptymalizowanych interfejsów użytkownika. Opisano w nim informacje o stanie jazdy samochodu oraz odpowiednie ograniczenia wygody użytkowników. Więcej informacji o ograniczeniach dotyczących wygody korzystania z samochodu (UX) znajdziesz na stronie Ograniczenia korzystania z samochodu, który zawiera informacje o 3 stanach jazdy: Zaparkowany, Bezczynny i Przeprowadzki.

Odbiorcy

Materiały te są przeznaczone dla osób, które chcą projektować aplikacje dostosowujące się do zmian stanu jazdy samochodu i odpowiednio nałożone ograniczenia UX.

Szczegóły techniczne

Menedżer stanu auta

Stan jazdy samochodu (zaparkowany, bezczynny lub w ruchu) jest określany na podstawie wartości z czujników dostarczanych przez warstwa abstrakcji sprzętu pojazdów (VHAL). podstawowe informacje z czujników, takie jak prędkość pojazdu, jest używany do ustalania aktualnego stanu jazdy pojazdu.

CarDrivingStateEvent.

udostępnia parametr @SystemApis, co oznacza, że tylko wewnętrzne zasoby platformy, pakiety APK (takie jak SysUI lub Ustawienia) oraz pliki APK z podwyższonymi uprawnieniami (np. GMSCore) mają dostęp do interfejsów API. Interfejsy API są chronione przez uprawnienia właściwe dla stanu jazdy android.car.permission.CAR_DRIVING_STATE. Klienci które wymagają dostępu do informacji o stanie jazdy, muszą o to poprosić.

CarUxRestrictionsManager

Aplikacje, które wyświetlają interfejs w zależności od stanu jazdy, muszą nasłuchiwać CarUxRestrictionsManager, co abstrakcyjne jest mapowanie stanu działania na ograniczenia UX, dzięki czemu aplikacje nie muszą dostosować do różnych wymagań dotyczących bezpieczeństwa na rynku.

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

Zamiast tego aplikacje monitorują ograniczenia ujawnione przez CarUxRestrictionsManager, a nie przez bezwzględny stan jazdy ujawniony przez CarDriveStateManager w związku z działaniem użytkownika lub interfejsami użytkownika.

Przykładowy kod

Ten przykładowy kod pokazuje, jak aplikacja monitoruje ograniczenia UX:

  1. Zaimportuj pakiety biblioteki samochodu:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
  2. Wdróż CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener). Ten detektor po zarejestrowaniu w CarUxRestrictionsManager jest wywoływany w przypadku zmiany ograniczeń UX. ma miejsce. Wprowadź zmiany w ograniczeniach, aby zoptymalizować rozpraszanie uwagi odpowiednio do potrzeb:
    @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ą samochodową:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
  4. Zadzwoń pod numer mCar.getCarManager() - mCarUxRestrictionsManager, aby pobrać CarUxRestrictionsManager:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
  5. Aby zarejestrować usługę mUxRChangeListener zaimplementowaną w kroku 2 powyżej za pomocą CarUxRestrictionsManager – połączenie z mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

Gotowy blok przykładowego kodu (utworzony w krokach od 3 do 5) sprawia, że detektor odbieranie ograniczeń po zmianie stanu dysku:

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 dostarcza 2 rodzajów informacji:

  1. Czy obecnie istnieje wymóg optymalizacji pod kątem rozpraszania uwagi?
  2. Jeśli tak, jakie są obecnie ograniczenia?

Gdy parametr CarUxRestrictions jest pobierany z getCurrentUxRestrictions() lub wywołania zwrotnego detektora, aplikacje mogą teraz używać za pomocą interfejsu API isRequiresDistractionOptimization(), aby określić, czy rozpraszanie uwagi Zoptymalizowany jest wymagane. Jeśli ta opcja zwraca wartość false, nie musisz stosować efektu rozpraszania uwagi Są zoptymalizowane i aplikacja może bezpiecznie uruchamiać każdą aktywność.

Jeśli wymagana jest optymalizacja, użyj interfejsu API getActiveRestrictions(), aby uzyskać zestaw ograniczeń. Ten Interfejs API zwraca wartość int, która jest bitową maską wszystkich aktualnie obowiązujących ograniczeń. zestaw ograniczeń, których dotyczy powiadomienie, znajduje się na liście CarUxRestrictions.

Uwaga: niewielkie zmiany w zestawie ograniczeń mogą być mogą wystąpić w najbliższej przyszłości.

Jeśli na przykład aplikacja chce sprawdzić, czy istnieje ograniczenie odtwarzania filmu, po aplikacja CarUxRestrictions musi sprawdzić ograniczenie:

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

Jazda samochodem

CarDriveStateManager pokazuje rzeczywisty stan jazdy pojazdu (zaparkowany, bezczynny lub Przenoszenie). Interfejsy API CarDriveStateManager można wywoływać podobnie do interfejsu CarUxRestrictionsManager. Aplikacje mogą rejestrować detektora lub sprawdzać bieżący stan jazdy. Zwrócony zostanie stan jazdy jako CarDriveStateEvent.

CarDrivingStateEvent.

zmian, metoda onDrivingStateChanged() jest wywoływana z nowym 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

Możesz naśladować zmiany biegów i prędkości, aby zmienić stan jazdy. Użyj powłoki ADB w celu wstrzykiwania zdarzeń dotyczących pojazdów. Może to być przydatne podczas programowania i testowania.

Aby symulować zdarzenia związane z jazdą samochodem:

  1. Aby ustawić szybkość na 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
  2. Aby ustawić wartość biegu na Zaparkowany (aby symulować zdarzenie CarDriveStateEvent wskazującym wartość PARKED):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
  3. Aby zmienić bieg na Dysk, ustaw prędkość na 0 (aby symulować do trybu nieaktywnego):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
  4. Aby ustawić prędkość na 30 metrów na sekundę (by symulować zdarzenie CarDriveStateEvent w kierunku MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30