Yerine getirme komutları

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:

  1. Sistem imzalı olarak yüklenmiş olmalıdır (bkz. AAOS ve örnek PackageValidator kodu).
  2. 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:

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

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.