यदि ब्लूटूथ डिवाइस कनेक्ट है तो प्रोग्रामेटिकली कैसे बताएं?


86

मैं समझता हूं कि युग्मित उपकरणों की एक सूची कैसे प्राप्त की जाए लेकिन अगर वे जुड़े हुए हैं तो मैं कैसे बता सकता हूं?

यह संभव होना चाहिए क्योंकि मैं उन्हें अपने फोन की ब्लूटूथ डिवाइस सूची में सूचीबद्ध देखता हूं और यह उनकी कनेक्शन स्थिति बताता है।

जवाबों:


155

अपने AndroidManifest में ब्लूटूथ अनुमति जोड़ें,

<uses-permission android:name="android.permission.BLUETOOTH" />

तब आशय फिल्टर का उपयोग को सुनने के लिए ACTION_ACL_CONNECTED, ACTION_ACL_DISCONNECT_REQUESTEDऔर ACTION_ACL_DISCONNECTEDप्रसारण:

public void onCreate() {
    ...
    IntentFilter filter = new IntentFilter();
    filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
    filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
    filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
    this.registerReceiver(mReceiver, filter);
}

//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
           ... //Device found
        }
        else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
           ... //Device is now connected
        }
        else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
           ... //Done searching
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
           ... //Device is about to disconnect
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
           ... //Device has disconnected
        }           
    }
};

कुछ नोट:

  • एप्लिकेशन स्टार्टअप पर कनेक्ट किए गए डिवाइसों की सूची पुनर्प्राप्त करने का कोई तरीका नहीं है। ब्लूटूथ API आपको QUERY की अनुमति नहीं देता है, इसके बजाय यह आपको CHANGES सुनने की अनुमति देता है।
  • उपरोक्त समस्या के चारों ओर एक कर्कश कार्य सभी ज्ञात / युग्मित उपकरणों की सूची को पुनः प्राप्त करना होगा ... फिर हर एक से जुड़ने का प्रयास करें (यह निर्धारित करने के लिए कि आप जुड़े हुए हैं)।
  • वैकल्पिक रूप से, आप एक पृष्ठभूमि सेवा ब्लूटूथ एपीआई देख सकते हैं और बाद की तारीख में उपयोग करने के लिए अपने आवेदन के लिए डिस्क पर डिवाइस स्थिति लिख सकते हैं।

2
यह तब तक अच्छा है जब तक मेरा आवेदन चल रहा है लेकिन मुझे वर्तमान सूची कैसे मिल सकती है?
डचेपेल

2
आप अपने एप्लिकेशन "रनिंग" के बिना कोड निष्पादित करने की योजना कैसे बनाते हैं? यदि आपको लगता है कि आपको किसी गतिविधि के अलावा किसी अन्य चीज़ से इसे एक्सेस करने की आवश्यकता है ... Google Android सेवाओं पर जाएं, प्रसारणों को सुनने के लिए उनमें से एक का निर्माण करें, और इसे एक सूची में बनाए रखें।
स्कीलार सूटन

6
मैं इरादे के लिए सुन सकता हूँ लेकिन मैं कैसे जुड़े ब्लूटूथ डिवाइस की प्रारंभिक सूची प्राप्त कर सकता हूं? यदि कोई मेरी गतिविधि या सेवा शुरू होने से पहले से ही जुड़ा हुआ है तो मुझे नहीं पता होगा। मैं कल्पना करूँगा (आशा) कि यह डेटा कहीं उपलब्ध है? मैं सिर्फ इन इरादों को सुनने के लिए एक सेवा (जो फोन चालू होने तक लगातार चलती है) बनाना नहीं चाहता।
dchappelle

11
एप्लिकेशन स्टार्टअप पर जुड़े उपकरणों की सूची को पुनः प्राप्त करने का कोई तरीका नहीं है। ब्लूटूथ एपीआई आपको केवल कनेक्शन परिवर्तनों को सुनने देगा। तो हाँ, इसे करने का एकमात्र तरीका एक लंबी चलने वाली सेवा है और एक सार्वजनिक सूची में जोड़ना / हटाना है। बहुत सारे डेवलपर्स द्वारा यह एक बड़ी शिकायत है। आपके प्रदर्शन की आवश्यकताओं के आधार पर आप युग्मित उपकरणों की सूची को पुनः प्राप्त कर सकते हैं और हर एक से जुड़ने का प्रयास कर सकते हैं। यदि यह विफल रहता है, तो यह उपलब्ध नहीं है। हालांकि चेतावनी का शब्द: .connect () एक अवरोधक ऑपरेशन है।
स्काइलर सटन

1
@skylarsutton +1 ने इस उत्तर के लिए एक गुच्छा धन्यवाद दिया, मुझे ब्लूटूथ पर शुरू करने में मदद की
AgentKnopf

33

मेरे उपयोग के मामले में मैं केवल यह देखना चाहता था कि क्या ब्लूटूथ हेडसेट एक वीओआईपी ऐप से जुड़ा है। निम्नलिखित समाधान ने मेरे लिए काम किया:

public static boolean isBluetoothHeadsetConnected() {
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
            && mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
} 

बेशक आपको ब्लूटूथ की आवश्यकता होगी:

<uses-permission android:name="android.permission.BLUETOOTH" />


2
यह वही है जिसकी मैं तलाश कर रहा था। बस लॉन्च की जांच करने के लिए कि ब्लूटूथ जुड़ा हुआ है या नहीं। धन्यवाद यह काम किया!
सुड007

11

उनके जवाब के लिए स्काईलार्सटन को बड़ा धन्यवाद। मैं यह उसकी प्रतिक्रिया के रूप में पोस्ट कर रहा हूं, लेकिन क्योंकि मैं कोड पोस्ट कर रहा हूं तो मैं एक टिप्पणी के रूप में जवाब नहीं दे सकता। मैंने पहले से ही उसके जवाब को रद्द कर दिया था, इसलिए मुझे किसी भी बिंदु की तलाश नहीं है बस इसे आगे बढ़ा रहा हूं।

किसी कारण से Android Studio द्वारा BluetoothAdapter.ACTION_ACL_CONNECTED को हल नहीं किया जा सका। शायद इसे एंड्रॉइड 4.2.2 में पदावनत किया गया था? यहाँ उसके कोड का एक संशोधन है। पंजीकरण कोड समान है; रिसीवर कोड थोड़ा अलग है। मैं इसे एक सेवा में उपयोग करता हूं जो कि ब्लूटूथ से जुड़े ध्वज को अपडेट करता है जो कि ऐप के संदर्भ के अन्य भागों में है।

    public void onCreate() {
        //...
        IntentFilter filter = new IntentFilter();
        filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
        filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
        filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
        this.registerReceiver(BTReceiver, filter);
    }

    //The BroadcastReceiver that listens for bluetooth broadcasts
    private final BroadcastReceiver BTReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            //Do something if connected
            Toast.makeText(getApplicationContext(), "BT Connected", Toast.LENGTH_SHORT).show();
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
            //Do something if disconnected
            Toast.makeText(getApplicationContext(), "BT Disconnected", Toast.LENGTH_SHORT).show();
        }
        //else if...
    }
};

1
आपका कोड सही है; यह 4.2.2 में पदावनत नहीं किया गया था। BluetoothAdapter वर्ग में शामिल नहीं है, ACTION_ACL_CONNECTED। वह तार BluetoothDevice क्लास में है।
रोबलैब्स

स्पष्ट करने के लिए धन्यवाद!
अपराह्न 12:00

4

एक भी नहीं है isConnected में BluetoothDevice प्रणाली एपीआई में समारोह https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java

यदि आप जानना चाहते हैं कि एक बंधे (जोड़ा) उपकरण वर्तमान में जुड़ा हुआ है या नहीं, तो निम्न कार्य मेरे लिए ठीक काम करता है:

public static boolean isConnected(BluetoothDevice device) {
    try {
        Method m = device.getClass().getMethod("isConnected", (Class[]) null);
        boolean connected = (boolean) m.invoke(device, (Object[]) null);
        return connected;
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
}

क्या आपने देखा है कि क्या यह जाँचने से अलग परिणाम देता है या नहीं bluetoothManager.getConnectionState(device, BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTED?
गम्भी द ग्रीन

मैं जो बता सकता हूं, वही परिणाम देते हैं। ध्यान दें कि कोटलिन उपयोगकर्ताओं के लिए, वे पहली दो लाइनें सिर्फ val m: Method = device.javaClass.getMethod("isConnected")और सिर्फ हैं val connected = m.invoke(device)
गम्भी द ग्रीन

धन्यवाद, वास्तव में मुझे क्या चाहिए! इस विधि के लिए यह कोटलिन बराबर है:fun isConnected(device: BluetoothDevice): Boolean { return try { val m: Method = device.javaClass.getMethod( "isConnected" ) m.invoke(device) as Boolean } catch (e: Exception) { throw IllegalStateException(e) } }
टेक्या जूल

1

यह कोड हेडसेट प्रोफाइल के लिए है, शायद यह अन्य प्रोफाइल के लिए भी काम करेगा। सबसे पहले आपको प्रोफ़ाइल श्रोता (कोटलिन कोड) प्रदान करना होगा:

private val mProfileListener = object : BluetoothProfile.ServiceListener {
    override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
        if (profile == BluetoothProfile.HEADSET) 
            mBluetoothHeadset = proxy as BluetoothHeadset            
    }

    override fun onServiceDisconnected(profile: Int) {
        if (profile == BluetoothProfile.HEADSET) {
            mBluetoothHeadset = null
        }
    }
}

फिर ब्लूटूथ की जाँच करते समय:

mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
    return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}

OnSeviceConnected कहे जाने तक थोड़ा समय लगता है। उसके बाद आपको इससे जुड़े हेडसेट उपकरणों की सूची मिल सकती है:

mBluetoothHeadset!!.connectedDevices

0

BluetoothAdapter.getDefaultAdapter().isEnabled -> जब ब्लूटूथ खुला हो तो सही रहता है

val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager

audioManager.isBluetoothScoOn -> डिवाइस कनेक्ट होने पर सही रिटर्न देता है


0

मैं वास्तव में एक डिवाइस की कनेक्शन स्थिति लाने के लिए एक रास्ता ढूंढ रहा था, न कि कनेक्शन घटनाओं को सुनने के लिए। यहाँ मेरे लिए क्या काम किया गया है:

BluetoothManager bm = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
List<BluetoothDevice> devices = bm.getConnectedDevices(BluetoothGatt.GATT);
int status = -1;

for (BluetoothDevice device : devices) {
  status = bm.getConnectionState(device, BLuetoothGatt.GATT);
  // compare status to:
  //   BluetoothProfile.STATE_CONNECTED
  //   BluetoothProfile.STATE_CONNECTING
  //   BluetoothProfile.STATE_DISCONNECTED
  //   BluetoothProfile.STATE_DISCONNECTING
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.