Bu sayfada, sesli etkileşimle komutların nasıl yerine getirileceği açıklanmaktadır.
Medya komutlarını yerine getirme
Medya ile ilgili komut, üç farklı gruba ayrılabilir:
- Harici medya kaynakları (ör. AAOS'de yüklü Spotify).
- Arka uç medya kaynakları (VIA üzerinden yayınlanan müzik gibi).
- Yerel medya kaynakları (araba radyosu gibi).
Harici medya kaynağı komutlarını işleme
Harici medya kaynakları, MediaSessionCompat
dilini destekleyen Android uygulamaları olarak tanımlanır
ve MediaBrowseCompat
API'ler (bkz. Şunun için medya uygulamaları geliştirme:
) inceleyin.
Önemli: Bir asistan uygulamasının
Tüm yüklü medya uygulamalarının MediaBrowseService
kadarı
sistem şu:
- Sistem imzalı olarak yüklenmiş olmalıdır (bkz.
AAOS ve örnek
PackageValidator
kodu). android.permission.MEDIA_CONTENT_CONTROL
sistem tarafından ayrıcalıklı olarak muhafaza edilsin (bkz. İzin Ver sisteme özel izinler) ekleyebilirsiniz.
MediaBrowserCompat
'e ek olarak
ve MediaControllerCompat
,
AAOS şunları sağlar:
CarMediaService
. seçili olan medya kaynağı hakkında merkezi bilgiler sağlar. Bu araç kapatıldıktan sonra önceden oynatılan medya kaynağını devam ettirmek için de kullanılır.car-media-common
; listeleme, bağlantı ve etkileşim için kullanışlı yöntemler sunar. en iyi yoludur.
Aşağıda, yaygın sesli etkileşimin uygulanmasına ilişkin yönergeler verilmiştir. komutlarının ikisine katlanır.
Yüklü medya kaynaklarının listesini alma
Medya kaynakları, PackageManager
kullanılarak algılanabilir.
ve MediaBrowserService.SERVICE_INTERFACE
ile eşleşen hizmetleri filtreleme.
Bazı arabalarda, özel medya tarayıcısı hizmeti uygulamaları,
ve bunların hariç tutulması gerekir. Bu mantığın bir örneğini aşağıda bulabilirsiniz:
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; }
Medya kaynaklarının herhangi bir zamanda yüklenebileceğini veya kaldırılabileceğini unutmayın. İçinde
doğru bir liste elde etmek için bir BroadcastReceiver
ACTION_PACKAGE_ADDED
intent işlemleri örneği
ACTION_PACKAGE_CHANGED
,
ACTION_PACKAGE_REPLACED
,
ve ACTION_PACKAGE_REMOVED
.
Şu anda oynatılan medya kaynağına bağlan
CarMediaService
seçili olan medya kaynağını alma yöntemleri sunar ve bu medya,
kaynak değişiklikleri. Bu değişiklikler, kullanıcının
veya araçta donanım düğmelerinin kullanılması gibi nedenlerden ötürü. Diğer yandan
araba medyası ortak kitaplığı, belirli bir medyaya bağlanmak için uygun yollar sunar
kaynak. Aşağıda, şu anda seçili olan cihaza nasıl bağlanacağınıza ilişkin basitleştirilmiş bir snippet verilmiştir
medya uygulaması:
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 } … }
Şu anda oynatılan medya kaynağının oynatılmasını kontrol et
Bağlı bir MediaBrowserCompat
ile
ulaşım kolayca gönderilebilir
kontrol komutlarını hedef uygulamaya aktarmanızı sağlar. Burada
örnek:
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; } … }
Yerel medya kaynağı komutlarını işleme (radyo, CD çalar, Bluetooth, USB)
Yerel medya kaynakları, işlevlerini aynı Yukarıda ayrıntılı olarak açıklanan MediaSession ve MediaBrowse API'leri. Farklı proje yönetimi yaklaşımlarına her tür donanımda, bu MediaBrowse hizmetleri, mobil cihazda düzenlemelerinizi komutlarını algılaması gerekir.
Radyo tutma yeri
Radio MediaBrowseService, ACTION_PLAY_BROADCASTRADIO
tarafından
intent filtresine dokunun. Oynatma kontrollerine ve medyaya göz atma deneyimine uyması beklenir.
Radyo'yu uygulama bölümünde açıklanmıştır. AAOS şunları sunar:
car-broadcastradio-support
OEM'lerin MediaBrowseService oluşturmasına yardımcı olacak sabit değerler ve yöntemler içeren kitaplık
kendi radyo hizmetleri için belirlenen protokole uyan uygulamaları,
ve göz atma ağacını tüketen uygulamalar (örneğin, VIA'lar) için destek sağlar.
Yardımcı girişi, CD sesi ve USB medyasını yönetme
Bu medya kaynaklarının, AOSP'nin bir parçası olarak varsayılan bir uygulaması yoktur. Önerilen yaklaşım şudur:
- Her biri için OEM'lerin medya hizmetlerini uygulamasını sağlayın. Ayrıntılar için Arabalar için medya uygulamaları geliştirme konusuna bakın.
- Bu MediaBrowseService uygulamaları, niyette belirlenir ve yanıtlanır. Genel oynatma amaçları bölümünde tanımlanan işlemler.
- Bu hizmetler, açıklanan yönergeleri izleyerek bir göz atma ağacı gösterir Diğer kaynak türleri başlıklı makaleyi inceleyin.
Bluetooth'u tutma
Bluetooth medya içeriği, AVRCP Bluetooth profili aracılığıyla açığa çıkar. İçinde Bu işleve erişimi kolaylaştırmak için AAOS, iletişim bilgileri (paketler/uygulamalar/Bluetooth bölümüne bakın).
İlgili medya tarayıcısı ağaç yapısı, BrowseTree bölümünde tanımlanmıştır. sınıfını kullanır. Oynatma kontrolü komutları diğer uygulamalara benzer şekilde iletilebilir. oturum açıyor.
Medya akışı komutlarını işleme
Sunucu tarafı medya akışını uygulamak için VIA kendisi olmalıdır MediaBrowse ve MediaSession API uygulayan bir medya kaynağı. Referans Medya uygulamaları geliştirme arabalar için anahtar kelimelerdir. Bu API'ler uygulandığında sesli kontrol uygulaması şunları yapabilir: (diğer hususların yanı sıra):
- Medya kaynağı seçimine sorunsuz katılma
- Araba yeniden başlatıldıktan sonra otomatik olarak devam ettirilir
- Media Center kullanıcı arayüzünü kullanarak oynatma ve göz atma kontrolü sağlama
- Standart donanım medya düğmesi etkinlikleri al
Gezinme komutlarını tamamla
Tüm navigasyon uygulamalarıyla etkileşimde bulunmanın standart bir yolu yoktur. Google Haritalar ile entegrasyon için bkz. Google Android Automotive Intents için Haritalar Diğer doğrudan uygulama geliştiricilerle iletişim kurar. Lansmandan önce (Google Haritalar dahil) bir niyeti varsa, bu niyetin (bkz. Amaç istekleri) bulabilirsiniz. Bu, kullanıcının belirli bir sorunla karşılaşması halinde bilgilendirilmesi hedef uygulama kullanılamıyor.
Araç komutlarını yerine getirme
Hem okuma hem de yazma için araç özelliklerine erişim izni verilir
CarPropertyManager).
Araç özellikleri, uygulanma şekli ve diğer ayrıntıları açıklanır
Mülk
yapılandırma başlıklı makaleyi inceleyin. Desteklenen özelliklerin doğru bir açıklaması için
doğrudan hardware/interfaces/automotive/vehicle/2.0/types.hal
adresine referansta bulunmak en iyisidir.
AraçMülk
burada tanımlanan numaralandırma hem standart hem de satıcıya özgü özellikler içerir,
türleri, değişiklik modunu, birimleri ve okuma/yazma erişimi tanımını içerir.
Bu sabit değerlere Java'dan erişmek için VehiclePropertyIds öğesini kullanabilirsiniz ve tamamlayıcı sınıfları. Farklı mülkler, kendi özelliklerini kontrol eden farklı Android izinlerine sahiptir. erişim. Bu izinler, CarService manifest'inde ve açıklanan özellikler ile izinler arasındaki eşleme VehiclePropertyIds Javadoc ve PropertyHalServiceIds'te zorunlu kılınır.
Araç özelliğini okuma
Aşağıda, araç hızının nasıl okunacağını gösteren bir örnek verilmiştir:
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); } ... }
Araç özelliği ayarlama
Aşağıda, ön klimanın nasıl açılıp kapatılacağını gösteren bir örnek verilmiştir.
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")); } … }
İletişim komutlarını yerine getirme
Mesajlaşma komutlarını işleme
VIA'lar, "dokunarak okuma" işleminden sonra gelen mesajları işlemelidir akış açıklaması
Sesli asistan'da
İsteğe bağlı olarak, gelen iletiyi gönderen kişiye yanıt göndermeyi işleyebilen Dokun ve Oku özelliği.
Ayrıca, VIA'lar SmsManager
hizmetini kullanabilir.
(android.telephony
'nin bir parçası
paketi) ile SMS mesajları oluşturup gönderebilirsiniz.
Arama komutlarını işleme
Benzer şekilde, VIA'lar TelephonyManager
kullanıcının sesli mesaj numarasını aramak için kullanılır. Böyle durumlarda
VIA'lar, doğrudan telefon yığınıyla veya Otomatik Çevirici ile etkileşim kurar.
uygulamasını indirin. Her halükarda, Araç Numara Çevirici uygulaması
kullanıcı arayüzü.
Diğer komutları yerine getirme
VIA ve iyi bilinen Android amaçları listesine göz atın. Birçok kullanıcı komutları sunucu tarafında çözümlenebilir (örneğin, kullanıcıların e-postaları ve takvim etkinlikleri gibi) sistemle etkileşim gerektirmediğinden iletişim kurmalısınız.
Gerçekçi işlemler (görsel içeriği görüntüleyin)
VIA, kullanıcının eylemlerini veya daha iyi anlaşılmasını sağladığı durumlarda görsel olarak tamamlayıcı niteliktedir. Sürücünün dikkatini dağıtan unsurları en aza indirmek için bu tür içeriklerin basit, kısa ve eyleme dökülebilir olmasını sağlamalıdır. Kullanıcı arayüzü/kullanıcı deneyimi yönergeleriyle ilgili ayrıntılar için kapsamlı işlemler hakkında Önceden Yüklenmiş Asistanlar: Kullanıcı Deneyimi Yönergeleri.
ana birim (HU) tasarımının geri kalanı için VIA'lar Araba Kullanıcı arayüzü öğelerinin çoğu için Kullanıcı Arayüzü Kitaplığı bileşenleri Ayrıntılar için bkz. Özelleştirme.