निर्देश पूरे करना

इस पेज पर बताया गया है कि बोलकर निर्देश देने की सुविधा की मदद से कैसे कार्रवाई की जाए.

मीडिया से जुड़े निर्देश पूरे करना

मीडिया से जुड़े निर्देश को तीन अलग-अलग ग्रुप में बांटा जा सकता है:

  • बाहरी मीडिया सोर्स (जैसे कि AAOS में Spotify इंस्टॉल किया गया).
  • बैकएंड मीडिया सोर्स (जैसे, वीआईए के ज़रिए स्ट्रीम किया गया संगीत).
  • स्थानीय मीडिया के स्रोत (जैसे कि कार का रेडियो).

बाहरी मीडिया सोर्स के निर्देशों को मैनेज करना

बाहरी मीडिया सोर्स ऐसे Android ऐप्लिकेशन हैं जो MediaSessionCompat के साथ काम करते हैं और MediaBrowseCompat APIs (इसके लिए मीडिया ऐप्लिकेशन बनाएं देखें कारें देखें.

अहम जानकारी: Assistant ऐप्लिकेशन को इंस्टॉल किए गए सभी मीडिया ऐप्लिकेशन का MediaBrowseService तो उसमें:

  1. सिस्टम द्वारा हस्ताक्षर किए गए के रूप में इंस्टॉल किया जाना चाहिए (इसके लिए मीडिया ऐप्लिकेशन विकास दिशानिर्देश देखें एएओएस और सैंपल PackageValidator कोड).
  2. android.permission.MEDIA_CONTENT_CONTROL सिस्टम के अधिकार वाले खाते को होल्ड करें अनुमति (देखें अनुदान सिस्टम के खास अधिकार वाली अनुमतियां).

MediaBrowserCompat के अलावा और MediaControllerCompat, AAOS से ये सुविधाएं मिलती हैं:

  • CarMediaService अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इस सुविधा से, चुने गए मीडिया सोर्स के बारे में एक ही जगह पर जानकारी मिलती है. यह है साथ ही, इसे कार के बंद होने के बाद वाले मीडिया सोर्स को फिर से चालू करने के लिए भी इस्तेमाल किया जाता है.
  • car-media-common, सूची बनाने, कनेक्ट करने, और इंटरैक्ट करने के आसान तरीके उपलब्ध कराता है मीडिया ऐप्लिकेशन के साथ.

वॉइस इंटरैक्शन को लागू करने के लिए, खास तौर पर दिशा-निर्देश दिए गए हैं निर्देश देखें.

इंस्टॉल किए गए मीडिया सोर्स की सूची पाएं

PackageManager का इस्तेमाल करके, मीडिया सोर्स का पता लगाया जा सकता है. और MediaBrowserService.SERVICE_INTERFACE से मेल खाने वाली सेवाओं के लिए फ़िल्टर करना. कुछ कारों में, मीडिया ब्राउज़र की सेवा इस्तेमाल करने के कुछ खास तरीके हो सकते हैं, जिसे बाहर रखा जाना चाहिए. यहां इस लॉजिक का एक उदाहरण दिया गया है:

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;
}

ध्यान रखें कि मीडिया सोर्स किसी भी समय इंस्टॉल या अनइंस्टॉल किए जा सकते हैं. तय सीमा में सटीक सूची बनाए रखने के लिए, BroadcastReceiver को लागू करने का सुझाव दिया जाता है इंटेंट ऐक्शन के लिए, ACTION_PACKAGE_ADDED, ACTION_PACKAGE_CHANGED, ACTION_PACKAGE_REPLACED, और ACTION_PACKAGE_REMOVED.

हाल ही में चल रहे मीडिया सोर्स से कनेक्ट करें

CarMediaService मौजूदा समय में चुने गए मीडिया सोर्स को पाने के तरीके दिखाता है और जब इस मीडिया स्रोत में होने वाले बदलाव. ये बदलाव इसलिए हो सकते हैं, क्योंकि उपयोगकर्ता ने यूज़र इंटरफ़ेस (यूआई) या कार के हार्डवेयर बटन के इस्तेमाल की वजह से. दूसरी ओर, कार-मीडिया-सामान्य लाइब्रेरी, दिए गए मीडिया से कनेक्ट करने के आसान तरीके उपलब्ध कराती है स्रोत. यहां एक आसान स्निपेट दिया गया है. इसमें, चुने गए मौजूदा ईमेल से कनेक्ट करने का तरीका बताया गया है मीडिया ऐप्लिकेशन:

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
    }

    …
}

चल रहे मीडिया सोर्स को चलाने की सुविधा को कंट्रोल करें

कनेक्ट किए गए MediaBrowserCompat के साथ परिवहन भेजना आसान है कंट्रोल कमांड को टारगेट ऐप्लिकेशन पर ले जाएं. यहाँ एक आसान तरीका दिया गया है उदाहरण:

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;
    }

    …
}

लोकल मीडिया सोर्स कमांड (रेडियो, सीडी प्लेयर, ब्लूटूथ, यूएसबी) मैनेज करना

स्थानीय मीडिया स्रोत उसी जानकारी का इस्तेमाल करके, अपने फ़ंक्शन को सिस्टम में दिखाते हैं ऊपर बताए गए Mediasession और MediaBrowser API. इनकी विशेषताओं को शामिल करने के लिए हर तरह का हार्डवेयर, ये Mediaब्राउज़ करें सेवाएं व्यवस्थित करने के लिए खास कन्वेंशन का इस्तेमाल करती हैं. सूचना और मीडिया आदेश दे सकता है.

रेडियो हैंडल करें

Radio MediaMusicService की पहचान ACTION_PLAY_BROADCASTRADIO से की जा सकती है इंटेंट फ़िल्टर का इस्तेमाल करें. वे प्लेबैक कंट्रोल और मीडिया ब्राउज़ को फ़ॉलो कर सकते हैं रेडियो लागू करें में बताया गया स्ट्रक्चर. AAOS car-broadcastradio-support लाइब्रेरी में कॉन्सटेंट और ऐसे तरीके शामिल हैं जिनकी मदद से, OEMs को Mediaब्राउज़Service बनाने में मदद मिलती है तय प्रोटोकॉल का पालन करने वाली अपनी रेडियो सेवाओं को लागू करना, साथ ही, उनके ब्राउज़ ट्री का इस्तेमाल करने वाले ऐप्लिकेशन के लिए सहायता उपलब्ध कराता है (उदाहरण के लिए, वीआईए).

सहायक इनपुट, सीडी ऑडियो, और यूएसबी मीडिया को हैंडल करें

एओएसपी के तौर पर, इन मीडिया सोर्स को डिफ़ॉल्ट रूप से लागू नहीं किया जाता है. सुझाया गया तरीका यह है:

ब्लूटूथ हैंडल करें

AVRCP ब्लूटूथ प्रोफ़ाइल से ब्लूटूथ मीडिया कॉन्टेंट को बिना अनुमति के सार्वजनिक किया जाता है. तय सीमा में इस सुविधा को ऐक्सेस करने के लिए, AAOS में MediaBrowserService और MediaOption को लागू करना जो कम्यूनिकेशन की जानकारी (पैकेज/ऐप्लिकेशन/ब्लूटूथ देखें).

मीडिया ब्राउज़र ट्री का स्ट्रक्चर ब्राउज़Tree में बताया गया है क्लास. प्लेबैक कंट्रोल के निर्देश, किसी दूसरे ऐप्लिकेशन की तरह ही डिलीवर किए जा सकते हैं, इसके लिए, Media Session लागू करना चाहिए.

स्ट्रीमिंग मीडिया के निर्देशों को मैनेज करना

सर्वर साइड मीडिया स्ट्रीमिंग लागू करने के लिए, VIA खुद ही होना चाहिए यह एक मीडिया सोर्स है, जो Mediaब्राउज़ और Mediasession API लागू करता है. इससे संदर्भ लें मीडिया ऐप्लिकेशन बनाएं कार के लिए. इन एपीआई को लागू करने से, आवाज़ से कंट्रोल करने वाला ऐप्लिकेशन, (अन्य चीज़ों के साथ):

  • मीडिया सोर्स चुनने में आसानी से शामिल हों
  • कार के रीस्टार्ट होने पर, यह सुविधा अपने-आप फिर से शुरू हो जाएगी
  • Media Center के यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके, प्लेबैक और ब्राउज़िंग के कंट्रोल उपलब्ध कराएं
  • स्टैंडर्ड हार्डवेयर मीडिया बटन इवेंट पाएं

सभी नेविगेशन ऐप्लिकेशन के साथ इंटरैक्ट करने का कोई स्टैंडर्ड तरीका नहीं है. Google Maps से इंटिग्रेशन के लिए, Google Android Automotive इंटेंट के लिए Maps. अन्य ऐसेट के साथ इंटिग्रेशन के लिए तो सीधे ऐप्लिकेशन डेवलपर से संपर्क करें. लॉन्च करने से पहले किसी भी ऐप्लिकेशन (इसमें Google Maps भी शामिल है) के इंटेंट के आधार पर, पुष्टि करें कि इंटेंट समाधान किया गया (इंटेंट देखें अनुरोध). इससे उपयोगकर्ता को उन मामलों में जानकारी देने का मौका मिलता है: टारगेट ऐप्लिकेशन उपलब्ध नहीं है.

वाहन के लिए निर्देश पूरे करना

रीड और राइट, दोनों के लिए वाहन प्रॉपर्टी का ऐक्सेस इसके ज़रिए दिया गया है CarpropertyManager. वाहन की प्रॉपर्टी के टाइप, उन्हें लागू करने के तरीके, और अन्य जानकारी के बारे में बताया गया है प्रॉपर्टी कॉन्फ़िगरेशन हैं. इस्तेमाल की जा सकने वाली प्रॉपर्टी के बारे में सटीक जानकारी पाने के लिए Android के लिए, सीधे hardware/interfaces/automotive/vehicle/2.0/types.hal से संपर्क करना बेहतर होता है. गाड़ी प्रॉपर्टी enum की परिभाषा यह है कि इसमें मानक और वेंडर, दोनों की खास प्रॉपर्टी, डेटा टाइप, मोड, यूनिट, और पढ़ने/लिखने के ऐक्सेस की सेटिंग बदलना.

Java से बनाए गए इन कॉन्सटेंट को ऐक्सेस करने के लिए, VehiclepropertyIds का इस्तेमाल करें और इसकी कंपैनियन क्लास है. अलग-अलग प्रॉपर्टी में Android की अलग-अलग अनुमतियां होती हैं, जो ऐक्सेस दें. इन अनुमतियों का एलान CarService में किया जाता है मेनिफ़ेस्ट और प्रॉपर्टी और अनुमतियों के बीच की मैपिंग शामिल है. गाड़ी प्रॉपर्टी आईडी में जाकर, Javadoc और प्रॉपर्टीHalServiceIds में लागू किया गया.

वाहन की प्रॉपर्टी को ऐक्सेस करने की अनुमति दें

यहां एक उदाहरण दिया गया है, जिसमें वाहन की रफ़्तार का पता लगाने का तरीका बताया गया है:

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);
    }

    ...
}

वाहन की प्रॉपर्टी सेट करना

इस उदाहरण में सामने के एसी को चालू और बंद करने का तरीका बताया गया है.

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"));
    }

    …
}

कम्यूनिकेशन से जुड़े निर्देश पूरे करें

मैसेज सेवा के निर्देशों को मैनेज करना

VIA को "टैप-टू-रीड" के बाद आने वाले मैसेज मैनेज करने चाहिए फ़्लो की जानकारी Voice Assistant में जाकर टैप-टू-रीड, जो मैसेज भेजने वाले व्यक्ति को जवाब देने का काम वैकल्पिक तौर पर कर सकती है. इसके अलावा, वीआईए SmsManager का इस्तेमाल भी कर सकता है (android.telephony का हिस्सा है सीधे कार से या ब्लूटूथ के ज़रिए मैसेज लिखने और भेजने के लिए पैकेज) का इस्तेमाल करें.

कॉल के निर्देशों को मैनेज करना

इसी तरह, वीआईए TelephonyManager का इस्तेमाल कर सकता है फ़ोन कॉल करने और उपयोगकर्ता के वॉइस मेल नंबर पर कॉल करने के लिए. ऐसे मामलों में, वीआईए, टेलीफ़ोनी स्टैक या कार डायलर से सीधे इंटरैक्ट करेगा है. किसी भी स्थिति में, कार डायलर ऐप्लिकेशन को उपयोगकर्ता को वॉइस-कॉल से जुड़ा यूज़र इंटरफ़ेस (यूआई) दिखाना.

अन्य निर्देश पूरे करना

VIA और VA के बीच इंटिग्रेशन के अन्य संभावित पॉइंट की सूची देखने के लिए सिस्टम में, जाने-माने Android इंटेंट की सूची देखें. कई उपयोगकर्ता के निर्देशों का समाधान सर्वर-साइड पर किया जा सकता है. उदाहरण के लिए, उपयोगकर्ताओं के ईमेल और कैलेंडर इवेंट) शामिल कर सकते हैं और उन्हें सिस्टम से किसी भी इंटरैक्शन की ज़रूरत नहीं होती का इस्तेमाल करने के लिए प्रोत्साहित करते हैं.

इमर्सिव ऐक्शन (विज़ुअल कॉन्टेंट दिखाएं)

जहां यह उपयोगकर्ता की कार्रवाइयों या समझ को बढ़ाता है, वहां VIA आपको कार की स्क्रीन पर अन्य विज़ुअल कॉन्टेंट. ड्राइवर का ध्यान भटकने से रोकने के लिए, ऐसे कॉन्टेंट को आसान, कम शब्दों में, और कार्रवाई करने लायक बनाए रखें. यूज़र इंटरफ़ेस (यूआई)/UX से जुड़े दिशा-निर्देशों के बारे में जानकारी के लिए इमर्सिव ऐक्शन पर है. यहां देखें पहले से लोड की गई Assistant: उपयोगकर्ता अनुभव से जुड़े दिशा-निर्देश.

इन्हें अपनी ज़रूरत के हिसाब से बनाने और एक जैसा अनुभव देने के लिए, बाकी की हेड यूनिट (HU) डिज़ाइन, VIA को कार ज़्यादातर यूज़र इंटरफ़ेस (यूआई) एलिमेंट के लिए, यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी के कॉम्पोनेंट. जानकारी के लिए, यह देखें पसंद के मुताबिक बनाएं.