इस पेज पर, बोलकर दिए गए निर्देशों को पूरा करने का तरीका बताया गया है.
मीडिया से जुड़े निर्देशों को पूरा करना
मीडिया से जुड़े निर्देशों को तीन अलग-अलग ग्रुप में बांटा जा सकता है:
- बाहरी मीडिया सोर्स (जैसे, AAOS में इंस्टॉल किया गया Spotify).
- बैकएंड मीडिया सोर्स (जैसे, VIA के ज़रिए स्ट्रीम किया गया संगीत).
- स्थानीय मीडिया सोर्स (जैसे, कार रेडियो).
बाहरी मीडिया सोर्स के निर्देशों को मैनेज करना
बाहरी मीडिया सोर्स, ऐसे Android ऐप्लिकेशन होते हैं जो MediaSessionCompat
और MediaBrowseCompat
एपीआई के साथ काम करते हैं. इन एपीआई के इस्तेमाल के बारे में ज़्यादा जानकारी के लिए, कार के लिए मीडिया ऐप्लिकेशन बनाएं लेख पढ़ें.
अहम जानकारी: किसी सहायक ऐप्लिकेशन के लिए, यह ज़रूरी है कि वह डिवाइस में इंस्टॉल किए गए सभी मीडिया ऐप्लिकेशन के MediaBrowseService
से कनेक्ट हो:
- सिस्टम से साइन किए गए तौर पर इंस्टॉल किया गया हो. AAOS के लिए मीडिया ऐप्लिकेशन डेवलपमेंट के दिशा-निर्देश और
PackageValidator
कोड का सैंपल देखें. - आपके पास
android.permission.MEDIA_CONTENT_CONTROL
सिस्टम की अनुमति होनी चाहिए (सिस्टम की अनुमतियां दें देखें).
MediaBrowserCompat
और MediaControllerCompat
के अलावा, एएओएस ये सुविधाएं भी देता है:
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; }
ध्यान रखें कि मीडिया सोर्स को किसी भी समय इंस्टॉल या अनइंस्टॉल किया जा सकता है. सटीक सूची बनाए रखने के लिए, हमारा सुझाव है कि आप इंटेंट ऐक्शन ACTION_PACKAGE_ADDED
,
ACTION_PACKAGE_CHANGED
,
ACTION_PACKAGE_REPLACED
, और ACTION_PACKAGE_REMOVED
के लिए BroadcastReceiver
इंस्टेंस लागू करें.
फ़िलहाल चल रहे मीडिया सोर्स से कनेक्ट करना
CarMediaService
, फ़िलहाल चुने गए मीडिया सोर्स को पाने के तरीके और यह बताता है कि मीडिया सोर्स कब बदलता है. ये बदलाव इसलिए हो सकते हैं, क्योंकि उपयोगकर्ता ने सीधे यूज़र इंटरफ़ेस (यूआई) के साथ इंटरैक्ट किया हो या कार में हार्डवेयर बटन का इस्तेमाल किया हो. वहीं दूसरी ओर, car-media-common लाइब्रेरी, किसी मीडिया सोर्स से कनेक्ट करने के आसान तरीके उपलब्ध कराती है. फ़िलहाल चुने गए मीडिया ऐप्लिकेशन से कनेक्ट करने का आसान तरीका यहां बताया गया है:
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 और MediaBrowse API का इस्तेमाल करके, सिस्टम को अपनी सुविधाएं दिखाते हैं. हर तरह के हार्डवेयर की खास बातों को ध्यान में रखते हुए, ये MediaBrowse सेवाएं अपनी जानकारी और मीडिया निर्देशों को व्यवस्थित करने के लिए, खास समझौतों का इस्तेमाल करती हैं.
रेडियो को मैनेज करना
रेडियो MediaBrowseService की पहचान, ACTION_PLAY_BROADCASTRADIO
इंटेंट फ़िल्टर से की जा सकती है. उन्हें रेडियो लागू करना में बताए गए प्लेबैक कंट्रोल और मीडिया ब्राउज़ करने के स्ट्रक्चर का पालन करना होगा. AAOS में एक ऐसी लाइब्रेरी होती है जिसमें car-broadcastradio-support
स्थिर वैल्यू और तरीके होते हैं. इनकी मदद से, OEM अपनी रेडियो सेवाओं के लिए MediaBrowseService लागू कर सकते हैं. ये सेवाएं, तय किए गए प्रोटोकॉल का पालन करती हैं. साथ ही, इस लाइब्रेरी में ब्राउज़ ट्री का इस्तेमाल करने वाले ऐप्लिकेशन (उदाहरण के लिए, VIAs) के लिए सहायता भी मिलती है.
सहायक इनपुट, सीडी ऑडियो, और यूएसबी मीडिया को मैनेज करना
AOSP के हिस्से के तौर पर, इन मीडिया सोर्स को डिफ़ॉल्ट रूप से लागू नहीं किया जाता. हमारा सुझाव है कि:
- OEM, हर डिवाइस के लिए मीडिया सेवाएं लागू करें. ज़्यादा जानकारी के लिए, कार के लिए मीडिया ऐप्लिकेशन बनाना लेख पढ़ें.
- वीडियो चलाने के सामान्य इंटेंट में बताई गई इंटेंट ऐक्शन में, MediaBrowseService के इन लागू होने की पहचान की जाएगी और इनका जवाब दिया जाएगा.
- ये सेवाएं, अन्य सोर्स टाइप में बताए गए दिशा-निर्देशों के मुताबिक, ब्राउज़ ट्री दिखाएंगी.
ब्लूटूथ को मैनेज करना
ब्लूटूथ मीडिया कॉन्टेंट, AVRCP ब्लूटूथ प्रोफ़ाइल के ज़रिए दिखाया जाता है. इस सुविधा को ऐक्सेस करने में आसानी हो, इसके लिए AAOS में MediaBrowserService और MediaSession लागू किया गया है. इससे, कम्यूनिकेशन की जानकारी को अलग किया जाता है. packages/apps/Bluetooth देखें.
मीडिया ब्राउज़र का ट्री स्ट्रक्चर, BrowseTree क्लास में तय किया गया है. MediaSession लागू करके, किसी भी दूसरे ऐप्लिकेशन की तरह ही, वीडियो चलाने या रोकने के निर्देश दिए जा सकते हैं.
स्ट्रीमिंग मीडिया से जुड़े निर्देशों को मैनेज करना
सर्वर साइड मीडिया स्ट्रीमिंग को लागू करने के लिए, VIA को खुद एक मीडिया सोर्स बनना होगा. इसके लिए, उसे MediaBrowse और MediaSession API को लागू करना होगा. कार के लिए मीडिया ऐप्लिकेशन बनाएं लेख पढ़ें. इन एपीआई को लागू करके, आवाज़ से कंट्रोल करने वाला ऐप्लिकेशन, इनके अलावा और भी काम कर सकता है:
- मीडिया सोर्स चुनने में आसानी से हिस्सा लेना
- कार के रीस्टार्ट होने के बाद, अपने-आप फिर से शुरू हो जाए
- Media Center के यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके, प्लेबैक और ब्राउज़िंग कंट्रोल उपलब्ध कराना
- हार्डवेयर के मीडिया बटन से होने वाले स्टैंडर्ड इवेंट पाना
नेविगेशन कमांड (स्क्रीन पर एक से दूसरी जगह जाने के लिए निर्देश) का पालन करना
सभी नेविगेशन ऐप्लिकेशन के साथ इंटरैक्ट करने का कोई स्टैंडर्ड तरीका नहीं है. Google Maps के साथ इंटिग्रेशन के लिए, Android के वाहन से जुड़े इंटेंट के लिए Google Maps देखें. अन्य ऐप्लिकेशन के साथ इंटिग्रेशन करने के लिए, सीधे ऐप्लिकेशन डेवलपर से संपर्क करें. किसी भी ऐप्लिकेशन (इसमें Google Maps भी शामिल है) में इंटेंट लॉन्च करने से पहले, पुष्टि करें कि इंटेंट को हल किया जा सकता है या नहीं. इसके लिए, इंटेंट के अनुरोध देखें. इससे, टारगेट किए गए ऐप्लिकेशन के उपलब्ध न होने पर, उपयोगकर्ता को इसकी जानकारी देने का मौका मिलता है.
वाहन के लिए निर्देशों को पूरा करना
CarPropertyManager की मदद से, वाहन की प्रॉपर्टी को पढ़ने और उनमें बदलाव करने का ऐक्सेस मिलता है.
वाहन की प्रॉपर्टी के टाइप, उन्हें लागू करने के तरीके, और अन्य जानकारी के बारे में प्रॉपर्टी कॉन्फ़िगरेशन में बताया गया है. Android के साथ काम करने वाली प्रॉपर्टी के बारे में सटीक जानकारी पाने के लिए, सीधे hardware/interfaces/automotive/vehicle/2.0/types.hal
देखें.
यहां बताई गई VehicleProperty सूची में, स्टैंडर्ड और वेंडर की खास प्रॉपर्टी, डेटा टाइप, बदलाव मोड, इकाइयां, और पढ़ने/लिखने के ऐक्सेस की परिभाषा, दोनों शामिल हैं.
Java से इन कॉन्स्टेंट को ऐक्सेस करने के लिए, VehiclePropertyIds और उसकी कंपैनियन क्लास का इस्तेमाल किया जा सकता है. अलग-अलग प्रॉपर्टी के ऐक्सेस को कंट्रोल करने के लिए, Android की अलग-अलग अनुमतियां होती हैं. इन अनुमतियों के बारे में CarService के मेनिफ़ेस्ट में बताया गया है. साथ ही, VehiclePropertyIds के Javadoc में प्रॉपर्टी और अनुमतियों के बीच की मैपिंग के बारे में बताया गया है. इसे PropertyHalServiceIds में लागू किया गया है.
वाहन की प्रॉपर्टी को पढ़ना
यहां वाहन की रफ़्तार पढ़ने का तरीका बताया गया है:
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")); } … }
कम्यूनिकेशन से जुड़े निर्देशों को पूरा करना
मैसेज से जुड़े निर्देशों को मैनेज करना
वीआईए को आने वाले मैसेज को मैनेज करने के लिए, वॉइस असिस्टेंट के लिए टैप करके पढ़ने की सुविधा में बताए गए "टैप करके पढ़ने" वाले फ़्लो का इस्तेमाल करना होगा. इस फ़्लो में, मैसेज भेजने वाले व्यक्ति को जवाब भेजने की सुविधा भी शामिल है. हालांकि, यह सुविधा ज़रूरी नहीं है.
इसके अलावा, सीधे कार से या ब्लूटूथ की मदद से एसएमएस लिखने और भेजने के लिए, वीआईए SmsManager
का इस्तेमाल कर सकते हैं. यह android.telephony
पैकेज का हिस्सा है.
कॉल से जुड़े निर्देशों को मैनेज करना
इसी तरह, वीआईए, फ़ोन कॉल करने और उपयोगकर्ता के वॉइसमेल नंबर पर कॉल करने के लिए, TelephonyManager
का इस्तेमाल कर सकते हैं. इन मामलों में,
वीआईए सीधे तौर पर टेलीफ़ोन स्टैक या कार डायलर ऐप्लिकेशन के साथ इंटरैक्ट करेंगे. किसी भी मामले में, उपयोगकर्ता को वॉइस-कॉल से जुड़ा यूज़र इंटरफ़ेस दिखाने वाला ऐप्लिकेशन, कार डायलर ऐप्लिकेशन होना चाहिए.
अन्य निर्देशों को पूरा करना
VIA और सिस्टम के बीच इंटिग्रेशन के अन्य संभावित पॉइंट की सूची के लिए, Android इंटेंट की सूची देखें. उपयोगकर्ता के कई निर्देशों को सर्वर-साइड पर पूरा किया जा सकता है. उदाहरण के लिए, उपयोगकर्ता के ईमेल और कैलेंडर इवेंट पढ़ना. इसके लिए, वॉइस इंटरैक्शन के अलावा सिस्टम के साथ किसी और तरह के इंटरैक्शन की ज़रूरत नहीं होती.
इमर्सिव कार्रवाइयां (विज़ुअल कॉन्टेंट दिखाना)
जहां यह उपयोगकर्ता की कार्रवाइयों या समझ को बेहतर बनाता है, वहां VIA कार की स्क्रीन पर अतिरिक्त विज़ुअल कॉन्टेंट दिखा सकता है. ड्राइवर का ध्यान भटकने से बचाने के लिए, ऐसा कॉन्टेंट आसान, छोटा, और काम का रखें. इमर्सिव ऐक्शन के लिए यूआई/यूएक्स के दिशा-निर्देशों के बारे में जानने के लिए, पहले से लोड की गई Assistant: यूएक्स के दिशा-निर्देश लेख पढ़ें.
हेड यूनिट (एचयू) के बाकी डिज़ाइन के साथ पसंद के मुताबिक बदलाव करने और एक जैसा अनुभव देने के लिए, वीआईए को ज़्यादातर यूज़र इंटरफ़ेस (यूआई) एलिमेंट के लिए, कार की यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी के कॉम्पोनेंट का इस्तेमाल करना चाहिए. ज़्यादा जानकारी के लिए, पसंद के मुताबिक बनाना लेख पढ़ें.