Korzystaj ze stanu jazdy samochodem i ograniczeń UX

Na tej stronie wyjaśniono, w jaki sposób aplikacje mogą płynnie przejść do interfejsów użytkownika zoptymalizowanych pod kątem rozpraszania uwagi (DO). Opisuje, w jaki sposób korzystać ze stanu jazdy samochodu, a także odpowiednie ograniczenia dotyczące doświadczenia użytkownika. Aby uzyskać więcej informacji na temat ograniczeń związanych z doświadczeniem użytkownika samochodu (UX), zobacz Ograniczenia dotyczące doświadczenia użytkownika samochodu , w którym szczegółowo opisano trzy stany jazdy: Zaparkowany, Na biegu jałowym i W ruchu.

Publiczność

Ta treść jest przeznaczona dla tych, którzy chcą projektować aplikacje, które dostosowują się do zmian w stanie jazdy samochodu i odpowiednio nałożonych ograniczeń UX.

Szczegóły techniczne

Menedżer stanu jazdy samochodu

Stan jazdy samochodu (zaparkowany, na biegu jałowym lub w ruchu) obliczany jest na podstawie wartości czujników dostarczonych przez warstwę abstrakcji sprzętu pojazdu (VHAL). Podstawowe informacje z czujników, takie jak prędkość pojazdu i aktualnie wybrany bieg, wykorzystywane są do określania aktualnego stanu jazdy pojazdu.

CarDrivingStateEvent .

który udostępnia @SystemApis, co oznacza, że ​​tylko elementy wewnętrzne platformy, pakiety APK w pakiecie (takie jak SysUI lub Ustawienia) i uprzywilejowane pliki APK (takie jak) GMSCore mogą uzyskać dostęp do interfejsów API. Interfejsy API są chronione uprawnieniami specyficznymi dla stanu jazdy android.car.permission.CAR_DRIVING_STATE . Klienci, którzy wymagają dostępu do informacji o stanie jazdy, muszą poprosić o to pozwolenie.

Menedżer ograniczeń CarUx

Te aplikacje, które wyświetlają interfejs użytkownika zależny od stanu jazdy, muszą nasłuchiwać CarUxRestrictionsManager , który abstrahuje mapowanie od stanu jazdy do ograniczeń UX, dzięki czemu aplikacje nie muszą dostosowywać się do różnych wymogów bezpieczeństwa rynkowego.

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 działania nie zostaną odpowiednio oznaczone, zostaną zablokowane.

Zamiast tego aplikacje monitorują ograniczenia ujawniane przez CarUxRestrictionsManager, a nie bezwzględny stan jazdy ujawniany przez CarDrivingStateManager w odniesieniu do czegokolwiek związanego z interfejsem użytkownika lub jego doświadczeniem.

Próbka kodu

Poniższy przykładowy kod ilustruje sposób, w jaki 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. Zaimplementuj CarUxRestrictionManager.OnUxRestrictionsChangedListener ( mUxRChangeListener ). Ten odbiornik, zarejestrowany w CarUxRestrictionsManager , jest wywoływany, gdy nastąpi zmiana ograniczeń UX. W razie potrzeby obsłuż zmiany ograniczeń, aby zoptymalizować rozpraszanie 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łącz się z usługą samochodu:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
    
  4. Wywołaj mCar.getCarManager() - mCarUxRestrictionsManager aby uzyskać CarUxRestrictionsManager :
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. Aby zarejestrować mUxRChangeListener zaimplementowany w kroku 2 powyżej za pomocą CarUxRestrictionsManager wywołaj mCarUxRestrictionsManager.registerListener() :
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Kompletny blok przykładowego kodu (utworzony w krokach od 3 do 5) powoduje, że odbiornik odbiera zmiany ograniczeń w przypadku zmiany 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());

Ograniczenia CarUx

Obiekt CarUxRestrictions udostępnia dwa typy informacji:

  1. Czy istnieje obecnie wymóg optymalizacji rozpraszania uwagi?
  2. Jeśli tak, jakie ograniczenia obecnie obowiązują?

Gdy wartość CarUxRestrictions zostanie uzyskana za pomocą getCurrentUxRestrictions() lub wywołania zwrotnego odbiornika, aplikacje mogą teraz korzystać z interfejsu API isRequiresDistractionOptimization() w celu ustalenia, czy wymagana jest funkcja zoptymalizowana pod kątem rozproszenia. Jeśli zwróci false , nie ma wymogu optymalizacji pod kątem rozpraszania uwagi, a aplikacja może bezpiecznie wykonywać dowolne czynności.

Jeśli wymagana jest optymalizacja, użyj funkcji API getActiveRestrictions() , aby uzyskać zestaw obowiązujących ograniczeń. Ten interfejs API zwraca wartość int , która jest maską bitową wszystkich aktualnie obowiązujących ograniczeń. Zestaw aktualnie zgłoszonych ograniczeń znajduje się na liście CarUxRestrictions .

Uwaga: przewiduje się, że w najbliższej przyszłości nastąpią niewielkie zmiany w zestawie ograniczeń.

Na przykład, jeśli aplikacja chce ustalić, czy istnieje ograniczenie odtwarzania wideo, po pobraniu obiektu CarUxRestrictions musi sprawdzić, czy istnieje ograniczenie:

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

Stan jazdy

CarDrivingStateManager przedstawia rzeczywisty stan jazdy pojazdu (zaparkowany, na biegu jałowym lub w ruchu). Interfejsy API CarDrivingStateManager można wywołać podobnie do CarUxRestrictionsManager. Aplikacje mogą zarejestrować słuchacza lub uzyskać aktualny stan jazdy. Stan jazdy jest zwracany jako CarDrivingStateEvent.

CarDrivingStateEvent .

zmian, wywoływana jest metoda onDrivingStateChanged() z nowym zdarzeniem 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ć zmianę biegów i prędkości, aby zmienić stan jazdy. Użyj polecenia powłoki ADB, aby wstrzyknąć zdarzenia pojazdu. Może to być przydatne podczas programowania i testowania.

Aby symulować zdarzenia podczas jazdy:

  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 na PARKED):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. Aby ustawić bieg na Drive, przy prędkości nadal równej 0 (aby symulować zdarzenie CarDrivingStateEvent wskazujące na BIEGU JAŁOWEGO):
    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 na RUCH):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30