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:
- Zaimportuj pakiety biblioteki samochodu:
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
- 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); } };
- 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 }
- Zadzwoń pod numer
mCar.getCarManager() - mCarUxRestrictionsManager
, aby pobraćCarUxRestrictionsManager
:CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
- Aby zarejestrować usługę
mUxRChangeListener
zaimplementowaną w kroku 2 powyżej za pomocąCarUxRestrictionsManager
– połączenie zmCarUxRestrictionsManager.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:
- Czy obecnie istnieje wymóg optymalizacji pod kątem rozpraszania uwagi?
- 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:
- Aby ustawić szybkość na 0:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- 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
- 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
- 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