ब्लूटूथ

Android पूरा ब्लूटूथ उपलब्ध कराता है लागू किया जा सकता है. यहां आपको कई ऐसे सुधार किए गए हैं जिनसे अन्य डिवाइसों पर परफ़ॉर्मेंस और अनुभव को बेहतर बनाया जा सकता है और सेवाओं.

ब्लूटूथ कनेक्शन मैनेजमेंट

Android में, Carब्लूटूथService, मौजूदा उपयोगकर्ता के ब्लूटूथ डिवाइसों और प्राथमिकता को बनाए रखता है की सूची होनी चाहिए. डिवाइस, प्रोफ़ाइल से तय प्राथमिकता क्रम. डिवाइसों को प्रोफ़ाइल से कब चालू, बंद, और कनेक्ट करना चाहिए डिफ़ॉल्ट कनेक्शन नीति के ज़रिए होती है, जिसे रिसॉर्स ओवरले पर भी जाएं, अगर चाहते हैं.

ऑटोमोटिव कनेक्शन मैनेजमेंट को कॉन्फ़िगर करना

डिफ़ॉल्ट फ़ोन नीति अक्षम करें

Android ब्लूटूथ स्टैक, उन फ़ोन के लिए कनेक्शन नीति बनाए रखता है जिन्हें इसकी मदद से चालू किया गया है डिफ़ॉल्ट. इस नीति का आपके डिवाइस पर बंद होना ज़रूरी है, ताकि इसका असर तय की गई ऑटोमोटिव नीति के तहत, Carब्लूटूथ सेवा. वैसे तो कार प्रॉडक्ट ओवरले में आपका ध्यान रखा जाना चाहिए, आप में जाकर फ़ोन नीति को बंद कर सकते हैं रिसॉर्स ओवरले को enable_phone_policy को false पर सेट करके /packages/apps/Bluetooth/res/values/config.xml में MAXIMUM_CONNECTED_DEVICES.

वाहन संबंधित डिफ़ॉल्ट नीति का इस्तेमाल करें

Carब्लूटूथService, प्रोफ़ाइल की डिफ़ॉल्ट अनुमतियों को बनाए रखता है. ज्ञात की सूची और उनकी प्रोफ़ाइल को दोबारा कनेक्ट करने से जुड़ी प्राथमिकताएं 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);
}

तय करें कि ब्लूटूथ अडैप्टर को कब चालू और बंद करना है

अपनी पसंद के मुताबिक बनाई गई नीति की मदद से, आपके पास यह तय करने का विकल्प होता है कि कौनसे इवेंट, इवेंट के लिए सबसे अच्छे समय की जानकारी दे रहे हैं एडाप् टर को सक्षम और अक्षम करें. ऐसा करने का एक ऐसा ही तरीका यह है कि पावर स्टेट का इस्तेमाल किया जाए MAXIMUM_CONNECTED_DEVICES इंच CarPowerManager:

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

तय करें कि डिवाइसों को कब कनेक्ट करना है

इसी तरह, जब आपको उन इवेंट के बारे में पता चलता है जिन्हें डिवाइस कनेक्शन को ट्रिगर करना चाहिए शुरू करें, Carब्लूटूथManager 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 में, आईवीआई की मदद से एक साथ कई डिवाइसों को जोड़ा जा सकता है पर टैप करें. कई डिवाइसों पर काम करने वाली ब्लूटूथ फ़ोन सेवाएं, लोगों को एक-दूसरे से कनेक्ट करने की सुविधा देती हैं साथ ही, एक ही समय पर अलग-अलग डिवाइस, जैसे कि निजी फ़ोन और ऑफ़िस का फ़ोन, और दोनों डिवाइसों से बोलकर इस्तेमाल करने की सुविधा मिलती है.

कनेक्शन की सीमाएं हर अलग-अलग ब्लूटूथ प्रोफ़ाइल के हिसाब से लागू की जाती हैं. आम तौर पर, यह सीमा, प्रोफ़ाइल सेवा को लागू करना. डिफ़ॉल्ट रूप से, Carब्लूटूथService से यह कोई तय नहीं किया जा सकता कि फ़ोन से ज़्यादा से ज़्यादा कितने डिवाइसों को जोड़ा जा सकता है अनुमति है.

हैंड्सफ़्री प्रोफ़ाइल

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

IVI को एचएफ़पी के ज़रिए कई डिवाइस से कनेक्ट किया जा सकता है. MAX_STATE_MACHINES_POSSIBLE अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है HeadsetClientService में MAXIMUM_CONNECTED_DEVICES से एक साथ एचएफ़पी की ज़्यादा से ज़्यादा संख्या के बारे में पता चलता है कनेक्शन.

जब कोई उपयोगकर्ता किसी डिवाइस से फ़ोन कॉल करता है या उसे कॉल करता है, तो फ़ोन खाता HfpClientConnection ऑब्जेक्ट बनाता है. डायलर ऐप्लिकेशन कॉल को मैनेज करने के लिए, HfpClientConnection ऑब्जेक्ट के साथ इंटरैक्ट करता है कॉल स्वीकार करने या कॉल काटने जैसी सुविधाएं.

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

मल्टी-डिवाइस एचएफ़पी की पुष्टि करें

यह देखने के लिए कि ब्लूटूथ पर मल्टी-डिवाइस कनेक्टिविटी ठीक से काम कर रही है या नहीं:

  1. ब्लूटूथ का इस्तेमाल करके, डिवाइस को IVI से कनेक्ट करें और डिवाइस.
  2. ब्लूटूथ का इस्तेमाल करके, दो फ़ोन को IVI से कनेक्ट करें.
  3. एक फ़ोन चुनें. सीधे फ़ोन से आउटगोइंग कॉल करें, और आईवीआई का इस्तेमाल करके आउटगोइंग कॉल करें.
    1. दोनों बार, स्ट्रीम किए जा रहे ऑडियो के रुकने और फ़ोन के ऑडियो की पुष्टि करें IVI से कनेक्ट किए गए स्पीकर पर चलाया जाता है.
  4. उसी फ़ोन का इस्तेमाल करके, सीधे फ़ोन पर इनकमिंग कॉल पाएं और की मदद से कॉल रिसीव किया जा सके.
    1. दोनों बार, स्ट्रीमिंग ऑडियो के रुकने और फ़ोन का ऑडियो IVI से कनेक्ट किए गए स्पीकर पर चल रहा है.
  5. फ़ोन से कनेक्ट किए गए दूसरे फ़ोन के साथ, तीसरे और चौथे चरण को दोहराएं.

आपातकालीन कॉल करने की सुविधा

आपातकालीन कॉल करने की क्षमता टेलीफ़ोनी और कार में ब्लूटूथ फ़ंक्शन. आपातकालीन कॉल करने के कई तरीके हैं की शुरुआत आईवीआई से की जाएगी. इसमें ये शामिल हैं:

  • स्टैंडअलोन ई-कॉल समाधान
  • आईवीआई में इंटिग्रेट किया गया ई-कॉल समाधान
  • पहले से कोई ब्लूटूथ सिस्टम मौजूद न होने पर, कनेक्ट किए गए ब्लूटूथ फ़ोन का इस्तेमाल करना

आपातकालीन कॉल करें

eCall डिवाइस को सुरक्षा के लिहाज़ से बहुत ज़रूरी माना जाता है, लेकिन फ़िलहाल इसे Android में इंटिग्रेट नहीं किया गया है. आप का उपयोग कर सकते है कनेक् शनService का इस्तेमाल, Android के ज़रिए आपातकालीन कॉल करने की सुविधाओं के लिए करता है. इसमें ये सुविधाएं भी शामिल हैं उन्हें आपातकालीन कॉल करने के लिए सुलभता विकल्प भी उपलब्ध कराए जा सकते हैं. इस बारे में ज़्यादा जानने के लिए, यह देखें कॉल के लिए इस्तेमाल किया जाने वाला ऐप्लिकेशन बनाना.

यहां आपातकालीन स्थिति शुरू करने के तरीके का एक उदाहरण दिया गया है कनेक्शन सेवा:

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 क्लाइंट स्टेट मशीन से इंटरैक्ट करता है, जिससे संपर्क कॉल करते समय उसे सही डिवाइस से जोड़ा गया हो.

पीबीएपी एकतरफ़ा होता है. इसलिए, आईवीआई की ज़रूरत होती है, ताकि वह MAXIMUM_CONNECTED_DEVICES इंच PbapClientService से पता चलता है कि एक साथ कितने PBAP डिवाइस ज़्यादा से ज़्यादा इस्तेमाल किए जा सकते हैं आईवीआई के साथ कनेक्शन की अनुमति है. PBAP क्लाइंट, हर एक के लिए संपर्क सेव करता है इससे कनेक्ट किया गया डिवाइस संपर्क सूची जिसे कोई ऐप्लिकेशन, फ़ोन से ऐक्सेस करने के लिए ऐक्सेस कर सकता है हर डिवाइस के लिए बुक कर सकते हैं.

इसके अलावा, प्रोफ़ाइल कनेक्शन को IVI और मोबाइल डिवाइस पर कनेक्ट करने के लिए. जब कोई PBAP क्लाइंट डिसकनेक्ट हो जाता है, आंतरिक डेटाबेस पहले कनेक्ट किया गया डिवाइस.

मैसेज की ऐक्सेस वाली प्रोफ़ाइल

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

मैसेज भेजने और पाने के मकसद से, मोबाइल डिवाइस से कनेक्ट करने के लिए तो IVI को MAP कनेक्शन शुरू करना चाहिए. MapClientService में MAXIMUM_CONNECTED_DEVICES से, एक साथ कई MAP डिवाइस की ज़्यादा से ज़्यादा संख्या के बारे में पता चलता है आईवीआई के साथ कनेक्शन की अनुमति है. हर कनेक्शन को आईवीआई और मोबाइल डिवाइस पर सेट करें, ताकि मैसेज ट्रांसफ़र किए जा सकें.

बेहतर ऑडियो डिस्ट्रिब्यूशन प्रोफ़ाइल

ब्लूटूथ ऐडवांस्ड ऑडियो डिस्ट्रिब्यूशन प्रोफ़ाइल (ए2डीपी) की मदद से, वाहन को कनेक्ट किए गए रिमोट डिवाइस से ऑडियो स्ट्रीम किया जाता है.

अन्य प्रोफ़ाइलों के उलट, कनेक्ट किए गए A2DP डिवाइस की ज़्यादा से ज़्यादा संख्या नेटिव स्टैक है और Java में नहीं है. फ़िलहाल, वैल्यू को इसका इस्तेमाल करके 1 के लिए हार्डकोड किया गया है इसमें kDefaultMaxConnectedAudioDevices वैरिएबल packages/modules/Bluetooth/system/btif/src/btif_av.cc.

ऑडियो/वीडियो रिमोट कंट्रोल प्रोफ़ाइल

ब्लूटूथ ऑडियो/वीडियो रिमोट कंट्रोल प्रोफ़ाइल (एवीआरसीपी) की मदद से, वाहन को कंट्रोल किया जा सकता है और कनेक्ट किए गए रिमोट डिवाइस पर मीडिया प्लेयर ब्राउज़ करें. दरअसल, आईवीआई हर एक किरदार की भूमिका निभाता है AVRCP कंट्रोलर, ऑडियो प्लेबैक पर असर डालने वाले ट्रिगर किए गए कंट्रोल, A2DP पर निर्भर करते हैं टारगेट डिवाइस से कनेक्ट करता है.

Android फ़ोन पर किसी खास मीडिया प्लेयर के लिए, जिसे आईवीआई एवीआरसीपी के ज़रिए ब्राउज़ कर सकता है. फ़ोन पर मौजूद मीडिया ऐप्लिकेशन को MediaBrowserService और com.android.bluetooth को इसे ऐक्सेस करने की अनुमति दें उस सेवा को लागू करना न भूलें. मीडिया ब्राउज़र सेवा बनाने में, इस बारे में पूरी जानकारी दी गई है.