Android, पूरी तरह से काम करने वाला ब्लूटूथ उपलब्ध कराता है. इसमें कार में मौजूद कई सामान्य ब्लूटूथ प्रोफ़ाइलों के साथ काम करने की सुविधा भी मिलती है. इसमें कई ऐसे बेहतर बदलाव भी हैं जिनसे अन्य डिवाइसों और सेवाओं के साथ परफ़ॉर्मेंस और अनुभव को बेहतर बनाया जा सकता है.
ब्लूटूथ कनेक्शन मैनेज करना
Android में, CarBluetoothService, मौजूदा उपयोगकर्ता के ब्लूटूथ डिवाइसों और आईवीआई से कनेक्ट की गई हर प्रोफ़ाइल के लिए प्राथमिकता सूचियों को मैनेज करता है. डिवाइसों को प्रोफ़ाइलों से, तय की गई प्राथमिकता के क्रम में कनेक्ट किया जाता है. डिवाइसों को किसी प्रोफ़ाइल से कनेक्ट करने, कनेक्ट करने की सुविधा को चालू या बंद करने का समय, डिफ़ॉल्ट कनेक्शन नीति से तय होता है. अगर ज़रूरत हो, तो संसाधन ओवरले का इस्तेमाल करके, इस नीति को बदला जा सकता है.
वाहन के कनेक्शन मैनेजमेंट को कॉन्फ़िगर करना
फ़ोन के लिए डिफ़ॉल्ट नीति बंद करना
Android ब्लूटूथ स्टैक, फ़ोन के लिए कनेक्शन से जुड़ी एक नीति बनाए रखता है. यह नीति डिफ़ॉल्ट रूप से चालू होती है. इस नीति को आपके डिवाइस पर बंद करना ज़रूरी है, ताकि यह
CarBluetoothService में मौजूद, वाहन से जुड़ी नीति के साथ मेल न खाए. कार प्रॉडक्ट ओवरले की मदद से, यह काम अपने-आप हो जाता है. हालांकि,
संसाधन ओवरले में फ़ोन की नीति को बंद किया जा सकता है. इसके लिए,
/packages/apps/Bluetooth/res/values/config.xml
में MAXIMUM_CONNECTED_DEVICES
में enable_phone_policy
को false
पर सेट करें.
वाहन संबंधित डिफ़ॉल्ट नीति का इस्तेमाल करना
CarBluetoothService, प्रोफ़ाइल की डिफ़ॉल्ट अनुमतियां बनाए रखता है. service/src/com/android/car/BluetoothProfileDeviceManager.java
में, पहले से इस्तेमाल किए जा रहे डिवाइसों और उनकी प्रोफ़ाइल को फिर से कनेक्ट करने की प्राथमिकताओं की सूची दी गई है.
साथ ही, ब्लूटूथ कनेक्शन मैनेजमेंट की नीति
service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
में देखी जा सकती है. डिफ़ॉल्ट रूप से,
यह नीति उन स्थितियों के बारे में बताती है जब ब्लूटूथ को बंडल किए गए डिवाइसों से कनेक्ट और डिसकनेक्ट करना चाहिए. यह कार के हिसाब से, अडैप्टर को चालू और बंद करने के समय को भी मैनेज करता है.
वाहन के कनेक्शन मैनेजमेंट के लिए अपनी पसंद के मुताबिक नीति बनाना
अगर आपकी ज़रूरतों के हिसाब से वाहन संबंधित डिफ़ॉल्ट नीति काम नहीं करती, तो अपनी पसंद के मुताबिक बनाई गई नीति के लिए इसे बंद भी किया जा सकता है. आपकी कस्टम नीति से यह तय होता है कि ब्लूटूथ अडैप्टर को कब चालू और बंद करना है. साथ ही, यह भी तय होता है कि डिवाइसों को कब कनेक्ट करना है. ब्लूटूथ अडैप्टर को चालू/बंद करने और डिवाइस कनेक्शन शुरू करने के लिए, कई तरह के इवेंट का इस्तेमाल किया जा सकता है. इनमें, कार की खास प्रॉपर्टी में हुए बदलावों की वजह से होने वाले इवेंट भी शामिल हैं.
वाहन संबंधित डिफ़ॉल्ट नीति बंद करना
सबसे पहले, कस्टम नीति का इस्तेमाल करने के लिए, रिसॉर्स ओवरले में useDefaultBluetoothConnectionPolicy
को false
पर सेट करके, वाहन संबंधित डिफ़ॉल्ट नीति को बंद करना होगा.
इस संसाधन को मूल रूप से
packages/services/Car/service/res/values/config.xml
में,
MAXIMUM_CONNECTED_DEVICES
का हिस्सा बताया गया है.
ब्लूटूथ अडैप्टर को चालू और बंद करना
आपकी नीति का एक मुख्य फ़ंक्शन, ब्लूटूथ अडैप्टर को सही समय पर चालू और बंद करना है. अडैप्टर को चालू और बंद करने के लिए, BluetoothAdapter.enable()
और
BluetoothAdapter.disable()
फ़्रेमवर्क एपीआई का इस्तेमाल किया जा सकता है.
इन कॉल में, सेटिंग या किसी अन्य तरीके से उपयोगकर्ता की चुनी गई सेटिंग का इस्तेमाल किया जाना चाहिए. ऐसा करने का एक तरीका यह है:
/** * Turn on the Bluetooth adapter. */ private void enableBluetooth() { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { return; } bluetoothAdapter.enable(); } /** * Turn off the Bluetooth adapter. */ private void disableBluetooth() { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { return; } // Will shut down _without_ persisting the off state as the desired state // of the Bluetooth adapter for next start up. This does nothing if the adapter // is already off, keeping the existing saved desired state for next reboot. bluetoothAdapter.disable(false); }
ब्लूटूथ अडैप्टर को चालू और बंद करने का समय तय करना
अपनी कस्टम नीति की मदद से, यह तय किया जा सकता है कि किन इवेंट से यह पता चलता है कि अडैप्टर को चालू और बंद करने का सबसे सही समय कब है. ऐसा करने का एक तरीका यह है कि CarPowerManager
में, डिवाइस की पावर की स्थितियों
MAXIMUM_CONNECTED_DEVICES
का इस्तेमाल करें:
private final CarPowerStateListenerWithCompletion mCarPowerStateListener = new CarPowerStateListenerWithCompletion() { @Override public void onStateChanged(int state, CompletableFuture<Void> future) { if (state == CarPowerManager.CarPowerStateListener.ON) { if (isBluetoothPersistedOn()) { enableBluetooth(); } return; } // "Shutdown Prepare" is when the user perceives the car as off // This is a good time to turn off Bluetooth if (state == CarPowerManager.CarPowerStateListener.SHUTDOWN_PREPARE) { disableBluetooth(); // Let CarPowerManagerService know we're ready to shut down if (future != null) { future.complete(null); } return; } } };
यह तय करना कि डिवाइसों को कब कनेक्ट करना है
इसी तरह, जब यह तय किया जाता है कि डिवाइस कनेक्शन शुरू करने के लिए कौनसे इवेंट ट्रिगर होने चाहिए, तो
CarBluetoothManager connectDevices()
एपीआई कॉल उपलब्ध कराता है. यह कॉल, हर ब्लूटूथ प्रोफ़ाइल के लिए तय की गई प्राथमिकता सूचियों के आधार पर डिवाइसों को कनेक्ट करता है.
ब्लूटूथ अडैप्टर के चालू होने पर, ऐसा करने का एक उदाहरण:
private class BluetoothBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); if (state == BluetoothAdapter.STATE_ON) { // mContext should be your app's context Car car = Car.createCar(mContext); CarBluetoothManager carBluetoothManager = (CarBluetoothManager) car.getCarManager(Car.BLUETOOTH_SERVICE); carBluetoothManager.connectDevices(); } } } }
वाहन के कनेक्शन मैनेजमेंट की पुष्टि करना
कनेक्शन की नीति के काम करने के तरीके की पुष्टि करने का सबसे आसान तरीका यह है कि आप अपने आईवीआई पर ब्लूटूथ चालू करें और पुष्टि करें कि यह सही क्रम में, सही डिवाइसों से अपने-आप कनेक्ट हो रहा है या नहीं. सेटिंग यूज़र इंटरफ़ेस (यूआई) या इन adb निर्देशों की मदद से, ब्लूटूथ अडैप्टर को टॉगल किया जा सकता है:
adb shell su u$(adb shell am get-current-user)_system svc bluetooth disable
adb shell su u$(adb shell am get-current-user)_system svc bluetooth enable
इसके अलावा, ब्लूटूथ कनेक्शन से जुड़ी डीबग जानकारी देखने के लिए, नीचे दिए गए निर्देश के आउटपुट का इस्तेमाल किया जा सकता है:
adb shell dumpsys car_service
आखिर में, अगर आपने अपनी वाहन संबंधित नीति बनाई है, तो किसी भी कस्टम कनेक्शन के व्यवहार की पुष्टि करने के लिए, उन इवेंट को कंट्रोल करना ज़रूरी है जिन्हें आपने डिवाइस कनेक्शन को ट्रिगर करने के लिए चुना है.
वाहनों के लिए ब्लूटूथ प्रोफ़ाइलें
Android में, IVI एक साथ कई डिवाइसों से कनेक्ट हो सकता है. इसके लिए, डिवाइसों को ब्लूटूथ से कनेक्ट करना होगा. एक से ज़्यादा डिवाइसों के लिए ब्लूटूथ फ़ोन सेवाओं की मदद से, उपयोगकर्ता एक साथ कई डिवाइसों को कनेक्ट कर सकते हैं. जैसे, निजी फ़ोन और काम का फ़ोन. साथ ही, इनमें से किसी भी डिवाइस से, बिना हाथ इस्तेमाल किए कॉल किए जा सकते हैं.
कनेक्शन की सीमाएं, हर ब्लूटूथ प्रोफ़ाइल के हिसाब से तय की जाती हैं. आम तौर पर, ये सीमाएं प्रोफ़ाइल सेवा के लागू होने के दौरान तय की जाती हैं. डिफ़ॉल्ट रूप से, CarBluetoothService, कनेक्ट किए गए डिवाइसों की संख्या के लिए कोई और फ़ैसला नहीं लेता.
Hands-Free Profile
ब्लूटूथ की मदद से, बोलकर इस्तेमाल करने की सुविधा (एचएफ़पी) की मदद से, वाहन में कनेक्ट किए गए रिमोट डिवाइस से फ़ोन कॉल किए जा सकते हैं और पाए जा सकते हैं. हर डिवाइस कनेक्शन, TelecomManager के साथ एक अलग फ़ोन खाता रजिस्टर करता है. यह IVI ऐप्लिकेशन को उपलब्ध फ़ोन खातों का विज्ञापन दिखाता है.
IVI, एचएफ़पी (हैंड्स-फ़्री प्रोफ़ाइल) की मदद से कई डिवाइसों से कनेक्ट हो सकता है.
HeadsetClientService
में MAX_STATE_MACHINES_POSSIBLE
MAXIMUM_CONNECTED_DEVICES
से यह तय होता है कि एक साथ HFP के कितने कनेक्शन हो सकते हैं.
जब कोई उपयोगकर्ता किसी डिवाइस से फ़ोन कॉल करता है या उसे कॉल मिलता है, तो उससे जुड़ा फ़ोन खाता एक HfpClientConnection
ऑब्जेक्ट बनाता है. Dialer ऐप्लिकेशन, कॉल की सुविधाओं को मैनेज करने के लिए HfpClientConnection
ऑब्जेक्ट के साथ इंटरैक्ट करता है. जैसे, कॉल स्वीकार करना या कॉल खत्म करना.
ध्यान दें कि डिफ़ॉल्ट Dialer ऐप्लिकेशन, एक साथ कई HFP डिवाइसों से कनेक्ट नहीं हो सकता. एक से ज़्यादा डिवाइसों के लिए HFP को लागू करने के लिए, उपयोगकर्ताओं को यह चुनने की सुविधा देनी होगी कि कॉल करते समय किस डिवाइस के खाते का इस्तेमाल करना है. इसके लिए, इसे पसंद के मुताबिक बनाना ज़रूरी है. इसके बाद, ऐप्लिकेशन सही खाते से telecomManager.placeCall
को कॉल करता है. आपको यह पुष्टि करनी होगी कि कई डिवाइसों पर काम करने वाले अन्य फ़ंक्शन भी सही तरीके से काम कर रहे हैं.
एक से ज़्यादा डिवाइसों के लिए HFP की पुष्टि करना
यह देखने के लिए कि ब्लूटूथ की मदद से, एक से ज़्यादा डिवाइसों से कनेक्ट करने की सुविधा ठीक से काम कर रही है या नहीं:
- ब्लूटूथ का इस्तेमाल करके, किसी डिवाइस को IVI से कनेक्ट करें और उस डिवाइस से ऑडियो स्ट्रीम करें.
- दो फ़ोन को ब्लूटूथ की मदद से IVI से कनेक्ट करें.
- कोई एक फ़ोन चुनें. सीधे फ़ोन से आउटगोइंग कॉल करें और IVI का इस्तेमाल करके आउटगोइंग कॉल करें.
- दोनों बार, पुष्टि करें कि स्ट्रीम किया गया ऑडियो रुक गया है और फ़ोन का ऑडियो, IVI से कनेक्ट किए गए स्पीकर पर चल रहा है.
- उसी फ़ोन का इस्तेमाल करके, सीधे फ़ोन पर आने वाला कॉल पाएं और
IVI का इस्तेमाल करके आने वाला कॉल पाएं.
- दोनों बार, पुष्टि करें कि स्ट्रीमिंग ऑडियो रुक गया है और IVI से कनेक्ट किए गए स्पीकर पर फ़ोन का ऑडियो चल रहा है.
- कनेक्ट किए गए दूसरे फ़ोन के लिए, तीसरा और चौथा चरण दोहराएं.
आपातकालीन कॉल करने की सुविधा
कार में आपातकालीन कॉल करने की सुविधा, टेलीफ़ोन और ब्लूटूथ फ़ंक्शन का एक अहम हिस्सा है. आईवीआई से आपातकालीन कॉल करने के कई तरीके हैं. इनमें ये शामिल हैं:
- स्टैंडअलोन ई-कॉल सलूशन
- आईवीआई में इंटिग्रेट किया गया ई-कॉल सलूशन
- जब कोई डिवाइस में पहले से मौजूद सिस्टम उपलब्ध न हो, तब कनेक्ट किए गए ब्लूटूथ फ़ोन पर निर्भर रहना
आपातकालीन कॉल कनेक्ट करना
ई-कॉल की सुविधा, सुरक्षा के लिहाज़ से ज़रूरी है. हालांकि, फ़िलहाल इसे Android में इंटिग्रेट नहीं किया गया है. Android की मदद से आपातकालीन कॉल करने की सुविधाएं दिखाने के लिए, ConnectionService का इस्तेमाल किया जा सकता है. इससे, आपातकालीन कॉल के लिए, ऐक्सेस करने के विकल्प भी उपलब्ध कराए जा सकते हैं. ज़्यादा जानने के लिए, कॉलिंग ऐप्लिकेशन बनाना लेख पढ़ें.
आपातकालीन ConnectionService सेट अप करने का उदाहरण यहां दिया गया है:
public class YourEmergencyConnectionService extends ConnectionService { @Override public Connection onCreateOutgoingConnection( PhoneAccountHandle connectionManagerAccount, ConnectionRequest request) { // Your equipment specific procedure to make ecall // ... } private void onYourEcallEquipmentReady() { PhoneAccountHandle handle = new PhoneAccountHandle(new ComponentName(context, YourEmergencyConnectionService), YourEmergencyConnectionId); PhoneAccount account = new PhoneAccount.Builder(handle, eCallOnlyAccount) .setSupportedUriSchemes(Arrays.asList(PhoneAccount.SCHEME_TEL)) .setCapabilities(PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS | PhoneAccount.CAPABILITY_MULTI_USER) .build(): mTelecomManager.registerPhoneAccount(account); mTelecomManager.enablePhoneAccount(account.getAccountHandle(), true); } }
आपातकालीन कॉल के लिए ब्लूटूथ चालू करना
Android 10 से पहले, इमरजेंसी नंबर पर कॉल करने के लिए, फ़ोन से सीधे डायल करना पड़ता था. साथ ही, अगर उपलब्ध हो, तो खास उपकरण को चालू करना पड़ता था. उदाहरण के लिए, खतरे का पता चलने या उपयोगकर्ता की कार्रवाई होने पर अपने-आप ट्रिगर होना. Android 10 और उसके बाद के वर्शन में, कार में मौजूद डायलर ऐप्लिकेशन से सीधे तौर पर किसी इमरजेंसी नंबर पर कॉल किया जा सकता है. इसके लिए, MAXIMUM_CONNECTED_DEVICES
में यह
apps/Bluetooth/res/values/config.xml
होना ज़रूरी है:
<!-- For supporting emergency call through the hfp client connection service -->
<bool name=”hfp_client_connection_service_support_emergency_call”>true</bool>
आपातकालीन कॉल करने की सुविधा को इस तरह लागू करने पर, वॉइस पहचान जैसे अन्य ऐप्लिकेशन भी आपातकालीन नंबर पर कॉल कर सकते हैं.
फ़ोन बुक ऐक्सेस करने की प्रोफ़ाइल
ब्लूटूथ फ़ोनबुक ऐक्सेस प्रोफ़ाइल (पीबीएपी), कनेक्ट किए गए रिमोट डिवाइस से संपर्क और कॉल इतिहास डाउनलोड करती है. PBAP, इकट्ठा किए गए संपर्कों की एक सूची बनाए रखता है, जिसमें खोज की जा सकती है. इस सूची को PBAP क्लाइंट स्टेट मशीन अपडेट करती है. कनेक्ट किया गया हर डिवाइस, एक अलग PBAP क्लाइंट स्टेट मशीन के साथ इंटरैक्ट करता है. इसकी वजह से, कॉल करते समय संपर्कों को सही डिवाइस से जोड़ा जाता है.
PBAP एकतरफ़ा होता है. इसलिए, IVI को किसी भी MAXIMUM_CONNECTED_DEVICES
से कनेक्शन बनाने के लिए,
PbapClientService
में तय किया गया है कि IVI के साथ एक साथ ज़्यादा से ज़्यादा कितने PBAP डिवाइसों से कनेक्शन किया जा सकता है. PBAP क्लाइंट, कनेक्ट किए गए हर डिवाइस के संपर्कों को
संपर्कों की सेवा देने वाली कंपनी में सेव करता है. इसके बाद, हर डिवाइस की फ़ोन बुक पाने के लिए, किसी ऐप्लिकेशन से इन संपर्कों को ऐक्सेस किया जा सकता है.
इसके अलावा, प्रोफ़ाइल को कनेक्ट करने के लिए, आईवीआई और मोबाइल डिवाइस, दोनों को अनुमति देनी होगी. जब कोई PBAP क्लाइंट डिसकनेक्ट होता है, तो डिवाइस का डेटाबेस, पहले से कनेक्ट किए गए डिवाइस से जुड़े सभी संपर्कों और कॉल इतिहास को मिटा देता है.
मैसेज ऐक्सेस प्रोफ़ाइल
ब्लूटूथ मैसेज ऐक्सेस प्रोफ़ाइल (एमएपी) की मदद से, वाहन को कनेक्ट किए गए रिमोट डिवाइस से एसएमएस भेजने और पाने की अनुमति मिलती है. फ़िलहाल, मैसेज को आईवीआई पर लोकल स्टोरेज में सेव नहीं किया जाता. इसके बजाय, जब भी कनेक्ट किए गए रिमोट डिवाइस को कोई मैसेज मिलता है, तो IVI उस मैसेज को पाता है और उसे पार्स करता है. साथ ही, उसके कॉन्टेंट को Intent इंस्टेंस में ब्रॉडकास्ट करता है, जिसे किसी ऐप्लिकेशन से पाया जा सकता है.
मैसेज भेजने और पाने के लिए, किसी मोबाइल डिवाइस से कनेक्ट करने के लिए, आईवीआई को एमएपी कनेक्शन शुरू करना होगा.
MapClientService
में मौजूद MAXIMUM_CONNECTED_DEVICES
से यह तय होता है कि आईवीआई के साथ एक साथ ज़्यादा से ज़्यादा कितने एमएपी डिवाइस कनेक्ट किए जा सकते हैं. मैसेज ट्रांसफ़र करने से पहले, हर कनेक्शन को आईवीआई और मोबाइल डिवाइस से अनुमति लेनी होगी.
ऐडवांस ऑडियो डिस्ट्रिब्यूशन प्रोफ़ाइल
ब्लूटूथ एडवांस्ड ऑडियो डिस्ट्रिब्यूशन प्रोफ़ाइल (A2DP) की मदद से, वाहन में कनेक्ट किए गए रिमोट डिवाइस से ऑडियो स्ट्रीम को रिसीव किया जा सकता है.
अन्य प्रोफ़ाइलों के उलट, कनेक्ट किए गए A2DP डिवाइसों की ज़्यादा से ज़्यादा संख्या, नेटिव स्टैक में लागू की जाती है, न कि Java में. फ़िलहाल, वैल्यू को
packages/modules/Bluetooth/system/btif/src/btif_av.cc
में kDefaultMaxConnectedAudioDevices
वैरिएबल का इस्तेमाल करके, 1
पर हार्डकोड किया गया है.
ऑडियो/वीडियो रिमोट कंट्रोल प्रोफ़ाइल
ब्लूटूथ ऑडियो/वीडियो रिमोट कंट्रोल प्रोफ़ाइल (एवीआरसीपी) की मदद से, वाहन में कनेक्ट किए गए रिमोट डिवाइस पर मीडिया प्लेयर को कंट्रोल और ब्राउज़ किया जा सकता है. IVI, एक एवीआरसीपी कंट्रोलर की भूमिका निभाता है. इसलिए, ऑडियो चलाने पर असर डालने वाले ट्रिगर किए गए सभी कंट्रोल, टारगेट डिवाइस के A2DP कनेक्शन पर निर्भर करते हैं.
किसी Android फ़ोन पर मौजूद किसी मीडिया प्लेयर को, एवीआरसीपी के ज़रिए आईवीआई से ब्राउज़ किया जा सकता है. इसके लिए, ज़रूरी है कि फ़ोन पर मौजूद मीडिया ऐप्लिकेशन में
MediaBrowserService
की सुविधा हो और com.android.bluetooth
को उस सेवा का ऐक्सेस दिया गया हो.
मीडिया ब्राउज़र सेवा बनाना लेख में, इस बारे में पूरी जानकारी दी गई है.