Na tej stronie dowiesz się, jak wykonywać polecenia za pomocą interakcji głosowej.
Wykonywanie poleceń multimedialnych
Polecenia związane z multimediami można podzielić na 3 różne grupy:
- Zewnętrzne źródła multimediów (np. Spotify zainstalowane w systemie AAOS).
- Źródła multimediów backendu (takie jak muzyka przesyłana strumieniowo przez VIA).
- Lokalne źródła multimediów (np. radio samochodowe).
Obsługa poleceń zewnętrznych źródeł multimediów
Zewnętrzne źródła multimediów to aplikacje na Androida, które obsługują MediaSessionCompat
i MediaBrowseCompat
interfejsów API (patrz Tworzenie aplikacji multimedialnych dla
samochody, aby dowiedzieć się więcej o korzystaniu z tych interfejsów API.
Ważne: aby aplikacja Asystent mogła połączyć się z
MediaBrowseService
wszystkich zainstalowanych aplikacji do multimediów w
musi:
- być zainstalowana jako podpisany przez system (patrz wytyczne dotyczące tworzenia aplikacji multimedialnych dla
AAOS i przykładowym kodem w języku
PackageValidator
). - Zablokuj
android.permission.MEDIA_CONTENT_CONTROL
z uprawnieniami systemowymi (patrz Przyznawanie uprawnienia systemowe).
Oprócz MediaBrowserCompat
i MediaControllerCompat
,
AAOS zapewnia:
CarMediaService
zapewnia scentralizowane informacje na temat obecnie wybranego źródła multimediów. To jest służy też do wznawiania odtwarzania źródła multimediów po ponownym uruchomieniu samochodu.car-media-common
zapewnia wygodne metody tworzenia list, kontaktowania się i wchodzenia w interakcje dzięki aplikacjom do multimediów.
Poniżej znajdziesz wskazówki dotyczące wdrażania typowych interakcji głosowych. poleceń.
Pobieranie listy zainstalowanych źródeł multimediów
Źródła multimediów można wykrywać za pomocą PackageManager
,
i filtrowanie pod kątem usług pasujących do MediaBrowserService.SERVICE_INTERFACE
.
W niektórych samochodach mogą być dostępne specjalne implementacje usługi przeglądarki multimediów,
które należy wykluczyć. Oto przykład takiej logiki:
private Map<String, MediaSource> getAvailableMediaSources() {
List<String> customMediaServices =
Arrays.asList(mContext.getResources()
.getStringArray(R.array.custom_media_packages));
List<ResolveInfo> mediaServices = mPackageManager.queryIntentServices(
new Intent(MediaBrowserService.SERVICE_INTERFACE),
PackageManager.GET_RESOLVED_FILTER);
Map<String, MediaSource> result = new HashMap<>();
for (ResolveInfo info : mediaServices) {
String packageName = info.serviceInfo.packageName;
if (customMediaServices.contains(packageName)) {
// Custom media sources should be ignored, as they might have a
// specialized handling (e.g., radio).
continue;
}
String className = info.serviceInfo.name;
ComponentName componentName = new ComponentName(packageName,
className);
MediaSource source = MediaSource.create(mContext, componentName);
result.put(source.getDisplayName().toString().toLowerCase(),
source);
}
return result;
}
Pamiętaj, że źródła multimediów mogą zostać zainstalowane lub odinstalowane w dowolnym momencie. W
aby zachować dokładną listę, zalecamy zaimplementowanie BroadcastReceiver
dla działań intencji ACTION_PACKAGE_ADDED
,
ACTION_PACKAGE_CHANGED
,
ACTION_PACKAGE_REPLACED
oraz ACTION_PACKAGE_REMOVED
.
Połącz z obecnie odtwarzanym źródłem multimediów
CarMediaService
udostępnia metody pobierania aktualnie wybranego źródła multimediów i gdy ten multimedia
zmian źródła. Te zmiany mogły wystąpić, gdy użytkownik wszedł w interakcję z
bezpośrednio lub przez użycie przycisków sprzętowych w samochodzie. Z drugiej strony,
biblioteka car-media-common oferuje wygodne sposoby łączenia się z danymi multimediami
źródła. Oto uproszczony opis sposobu łączenia się z aktualnie wybraną
aplikacja do multimediów:
public class MediaActuator implements
MediaBrowserConnector.onConnectedBrowserChanged {
private final Car mCar;
private CarMediaManager mCarMediaManager;
private MediaBrowserConnector mBrowserConnector;
…
public void initialize(Context context) {
mCar = Car.createCar(context);
mBrowserConnector = new MediaBrowserConnector(context, this);
mCarMediaManager = (CarMediaManager)
mCar.getCarManager(Car.CAR_MEDIA_SERVICE);
mBrowserConnector.connectTo(mCarMediaManager.getMediaSource());
…
}
@Override
public void onConnectedBrowserChanged(
@Nullable MediaBrowserCompat browser) {
// TODO: Handle connected/disconnected browser
}
…
}
Steruj odtwarzaniem aktualnie odtwarzanego źródła multimediów
Po połączeniu urządzenia MediaBrowserCompat
można łatwo wysłać transport
sterowanie za pomocą poleceń do aplikacji docelowej. Oto uproszczone rozwiązanie
przykład:
public class MediaActuator … {
…
private MediaControllerCompat mMediaController;
@Override
public void onConnectedBrowserChanged(
@Nullable MediaBrowserCompat browser) {
if (browser != null && browser.isConnected()) {
mMediaController = new MediaControllerCompat(mContext,
browser.getSessionToken());
} else {
mMediaController = null;
}
}
private boolean playSongOnCurrentSource(String song) {
if (mMediaController == null) {
// No source selected.
return false;
}
MediaControllerCompat.TransportControls controls =
mMediaController.getTransportControls();
PlaybackStateCompat state = controller.getPlaybackState();
if (state == null || ((state.getActions() &
PlaybackStateCompat.ACTION_PLAY_FROM_SEARCH) == 0)) {
// Source can't play from search
return false;
}
controls.playFromSearch(query, null);
return true;
}
…
}
Obsługa poleceń lokalnych źródeł multimediów (radio, odtwarzacz CD, Bluetooth, USB)
Lokalne źródła multimediów ujawniają swoje funkcje systemowi za pomocą tego samego Interfejsy API MediaSession i MediaBrowsing zostały opisane powyżej. Aby uwzględnić specyfikę dla każdego typu sprzętu, usługi MediaPrzeglądaj stosują określone konwencje do porządkowania informacji o nim i poleceniach multimedialnych.
Obsługa radia
Usługę Radio MediaBrowsingService można zidentyfikować za pomocą ACTION_PLAY_BROADCASTRADIO
filtr intencji. Powinny działać zgodnie z ustawieniami sterowania odtwarzaniem i przeglądaniem multimediów.
o strukturze opisanej w sekcji Implementowanie radia. AAOS oferuje
car-broadcastradio-support
biblioteka zawierająca stałe i metody pomagające producentom OEM utworzyć usługę MediaPrzeglądajService
implementacji własnych usług radiowych zgodnej ze zdefiniowanym protokołem
i zapewnia obsługę aplikacji, które korzystają z drzewa przeglądania (np. VIA).
Obsługa dodatkowego wejścia, odtwarzacza CD i nośnika USB
W ramach AOSP nie ma domyślnej implementacji tych źródeł multimediów. Zalecamy:
- Poproś producentów OEM o wdrożenie usług medialnych w przypadku każdego z nich. Aby dowiedzieć się więcej, zobacz Tworzenie aplikacji multimedialnych do samochodów.
- Te implementacje MediaPrzeglądajService można zidentyfikować i na nie odpowiedzieć działań zdefiniowanych w ogólnych intencjach odtwarzania.
- Te usługi udostępnią drzewo przeglądania zgodnie z opisanymi wytycznymi w sekcji Inne typy źródeł.
Obsługa Bluetootha
Treści multimedialne Bluetooth są udostępniane przez profil Bluetooth AVRCP. W Aby ułatwić dostęp do tej funkcji, AAOS zawiera Implementacja usługi Media BrowserService i MediaSession, która wyodrębnia dane komunikacyjne (patrz pakiety, aplikacje i Bluetooth).
Struktura drzewa przeglądarki multimediów jest zdefiniowana w zasadzie PrzeglądajTree. zajęcia. Polecenia sterowania odtwarzaniem mogą działać podobnie jak w przypadku każdej innej aplikacji, za pomocą implementacji MediaSession.
Obsługa poleceń strumieniowania multimediów
Aby zaimplementować strumieniowe przesyłanie multimediów po stronie serwera, interfejs VIA musi zostać przekształcony w siebie źródła multimediów przez zaimplementowanie interfejsów MediaPrzeglądaj i MediaSession API. Więcej informacji: Tworzenie aplikacji multimedialnych dla samochodów. Dzięki wdrożeniu tych interfejsów API aplikacja do sterowania głosem będzie mogła (między innymi):
- Sprawne uczestniczenie w wyborze źródeł multimediów
- Zostanie automatycznie wznawiane po ponownym uruchomieniu samochodu
- Udostępnianie elementów sterujących odtwarzaniem i przeglądaniem za pomocą interfejsu Media Center.
- Odbieraj zdarzenia dotyczące standardowych przycisków multimediów
Wykonywanie poleceń nawigacyjnych
Nie ma ujednoliconego sposobu interakcji ze wszystkimi aplikacjami do nawigacji. Informacje o integracji z Mapami Google znajdziesz w artykule na temat Google Mapy na Androida Automotive Intents. Integracja z innymi rozwiązaniami skontaktuj się bezpośrednio z deweloperem. Przed uruchomieniem do jakiejkolwiek aplikacji (w tym Map Google), sprawdź, czy intencją rozwiązany (zobacz Intencja ). Dzięki temu użytkownik może poinformować go w razie aplikacja docelowa jest niedostępna.
Wykonywanie poleceń pojazdu
Dostęp do właściwości pojazdu zarówno do odczytu, jak i do zapisu jest zapewniany przez
CarpropertyManager.
Omówiliśmy rodzaje nieruchomości, ich implementacja i inne szczegóły.
w usłudze
konfiguracji. Dokładny opis obsługiwanych obiektów
na Androidzie, zalecamy bezpośrednie odwołanie do witryny hardware/interfaces/automotive/vehicle/2.0/types.hal
.
Parametr Vehicleproperty
zdefiniowana w nim lista zawiera zarówno właściwości standardowe, jak i związane z konkretnym dostawcą,
typów, trybu zmiany, jednostek oraz definicji uprawnień do odczytu/zapisu.
Aby uzyskać dostęp do tych samych stałych w Javie, możesz użyć identyfikatorów VehiclepropertyId. oraz jego klas towarzyszących. Różne usługi mają różne uprawnienia w Androidzie, które kontrolują dostęp. Te uprawnienia są zadeklarowane w CarService w pliku manifestu oraz mapowania między usługami i uprawnieniami w polu Vehicle PropertyIds Javadoc i egzekwowane w propertyHalServiceIds.
Odczytywanie właściwości pojazdu
Ten przykład pokazuje, jak odczytywać prędkość pojazdu:
public class CarActuator ... {
private final Car mCar;
private final CarPropertyManager mCarPropertyManager;
private final TextToSpeech mTTS;
/** Global VHAL area id */
public static final int GLOBAL_AREA_ID = 0;
public CarActuator(Context context, TextToSpeech tts) {
mCar = Car.createCar(context);
mCarPropertyManager = (CarPropertyManager) mCar.getCarManager(Car.PROPERTY_SERVICE);
mTTS = tts;
...
}
@Nullable
private void getSpeedInMetersPerSecond() {
if (!mCarPropertyManager.isPropertyAvailable(VehiclePropertyIds.PERF_VEHICLE_SPEED,
GLOBAL_AREA_ID)) {
mTTS.speak("I'm sorry, but I can't read the speed of this vehicle");
return;
}
// Data type and unit can be found in
// automotive/vehicle/2.0/types.hal
float speedInMps = mCarPropertyManager.getFloatProperty(
VehiclePropertyIds.PERF_VEHICLE_SPEED, GLOBAL_AREA_ID);
int speedInMph = (int)(speedInMetersPerSecond * 2.23694f);
mTTS.speak(String.format("Sure. Your current speed is %d miles "
+ "per hour", speedInUserUnit);
}
...
}
Ustawianie właściwości pojazdu
Poniżej znajdziesz przykład włączania i wyłączania przedniej klimatyzacji.
public class CarActuator … {
…
private void changeFrontAC(boolean turnOn) {
List<CarPropertyConfig> configs = mCarPropertyManager
.getPropertyList(new ArraySet<>(Arrays.asList(
VehiclePropertyIds.HVAC_AC_ON)));
if (configs == null || configs.size() != 1) {
mTTS.speak("I'm sorry, but I can't control the AC of your vehicle");
return;
}
// Find the front area Ids for the AC property.
int[] areaIds = configs.get(0).getAreaIds();
List<Integer> areasToChange = new ArrayList<>();
for (int areaId : areaIds) {
if ((areaId & (VehicleAreaSeat.SEAT_ROW_1_CENTER
| VehicleAreaSeat.SEAT_ROW_1_LEFT
| VehicleAreaSeat.SEAT_ROW_1_RIGHT)) == 0) {
continue;
}
boolean isACInAreaAlreadyOn = mCarPropertyManager
.getBooleanProperty(VehiclePropertyIds.HVAC_AC_ON, areaId);
if ((!isACInAreaAlreadyOn && turnOn) || (isACInAreaAlreadyOn && !turnOn)) {
areasToChange.add(areaId);
}
}
if (areasToChange.isEmpty()) {
mTTS.speak(String.format("The AC is already %s", turnOn ? "on" : "off"));
return;
}
for (int areaId : areasToChange) {
mCarPropertyManager.setBooleanProperty(
VehiclePropertyIds.HVAC_AC_ON, areaId, turnOn);
}
mTTS.speak(String.format("Okay, I'm turning your front AC %s",
turnOn ? "on" : "off"));
}
…
}
Wypełnianie poleceń komunikacyjnych
Obsługa poleceń do obsługi wiadomości
VIA muszą obsługiwać wiadomości przychodzące po kliknięciu opisany proces
w Asystencie głosowym
Czytanie przez dotknięcie, które może opcjonalnie obsługiwać wysyłanie odpowiedzi do nadawcy wiadomości przychodzących.
VIA mogą też używać SmsManager
(część android.telephony
pakiet), aby tworzyć i wysyłać SMS-y bezpośrednio z samochodu lub przez Bluetooth.
Obsługa poleceń połączenia
W podobny sposób VIA mogą korzystać z TelephonyManager
nawiązywanie połączeń telefonicznych i dzwonienie pod numer poczty głosowej użytkownika. W takich przypadkach
VIA będą wchodzić w interakcję ze stosem usług telefonicznych bezpośrednio lub z telefonem samochodowym.
. W każdym przypadku to aplikacja Telefon musi
interfejsu połączeń głosowych.
Wykonywanie innych poleceń
Listę innych możliwych punktów integracji między VIA a usługą sprawdź listę dobrze znanych intencji Androida. Wiele polecenia użytkownika mogą być rozwiązywane po stronie serwera (na przykład odczytywanie użytkowników, e-maili i wydarzeń w kalendarzu) i nie wymagają żadnych interakcji z systemem oprócz interakcji głosowej.
Interaktywne działania (wyświetl treści wizualne)
Jeśli usprawnia działanie lub zrozumienie, VIA zapewnia: dodatkowe treści wizualne na ekranie samochodu. Aby zminimalizować rozpraszanie uwagi kierowcy: treści tego typu powinny być proste, zwięzłe i praktyczne. Szczegółowe informacje o wskazówkach dotyczących UI/UX na temat realistycznych działań, zobacz Wstępnie załadowani asystenci: wskazówki UX.
Aby umożliwić dostosowanie i spójność z parametrami w przypadku reszty jednostki centralnej (HU), w interfejsie ViA należy użyć Samochód Biblioteka UI. Więcej informacji: Dostosowywanie.