Wykonaj polecenia

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:

  1. być zainstalowana jako podpisany przez system (patrz wytyczne dotyczące tworzenia aplikacji multimedialnych dla AAOS i przykładowym kodem w języku PackageValidator).
  2. 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:

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

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.