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:
- Zaimportuj pakiety biblioteki samochodów:
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
- 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); } };
- 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 }
- Zadzwoń pod numer
mCar.getCarManager() - mCarUxRestrictionsManager
, aby uzyskać informacje oCarUxRestrictionsManager
:CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
- Aby zarejestrować
mUxRChangeListener
zaimplementowane w kroku 2 za pomocą wywołaniaCarUxRestrictionsManager
: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:
- Czy obecnie obowiązuje wymóg optymalizacji pod kątem rozpraszających elementów?
- 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:
- 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 PARKED):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
- 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
- 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