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:
- Zaimportuj pakiety biblioteki samochodu:
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
- 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); } };
- 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 }
- Wywołaj
mCar.getCarManager() - mCarUxRestrictionsManager
aby uzyskaćCarUxRestrictionsManager
:CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
- Aby zarejestrować
mUxRChangeListener
zaimplementowany w kroku 2 powyżej za pomocąCarUxRestrictionsManager
wywołajmCarUxRestrictionsManager.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:
- Czy istnieje obecnie wymóg optymalizacji rozpraszania uwagi?
- 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:
- Aby ustawić prędkość na 0:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- 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
- 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
- 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