मैं समझता हूं कि युग्मित उपकरणों की एक सूची कैसे प्राप्त की जाए लेकिन अगर वे जुड़े हुए हैं तो मैं कैसे बता सकता हूं?
यह संभव होना चाहिए क्योंकि मैं उन्हें अपने फोन की ब्लूटूथ डिवाइस सूची में सूचीबद्ध देखता हूं और यह उनकी कनेक्शन स्थिति बताता है।
मैं समझता हूं कि युग्मित उपकरणों की एक सूची कैसे प्राप्त की जाए लेकिन अगर वे जुड़े हुए हैं तो मैं कैसे बता सकता हूं?
यह संभव होना चाहिए क्योंकि मैं उन्हें अपने फोन की ब्लूटूथ डिवाइस सूची में सूचीबद्ध देखता हूं और यह उनकी कनेक्शन स्थिति बताता है।
जवाबों:
अपने 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
}
}
};
कुछ नोट:
मेरे उपयोग के मामले में मैं केवल यह देखना चाहता था कि क्या ब्लूटूथ हेडसेट एक वीओआईपी ऐप से जुड़ा है। निम्नलिखित समाधान ने मेरे लिए काम किया:
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" />
उनके जवाब के लिए स्काईलार्सटन को बड़ा धन्यवाद। मैं यह उसकी प्रतिक्रिया के रूप में पोस्ट कर रहा हूं, लेकिन क्योंकि मैं कोड पोस्ट कर रहा हूं तो मैं एक टिप्पणी के रूप में जवाब नहीं दे सकता। मैंने पहले से ही उसके जवाब को रद्द कर दिया था, इसलिए मुझे किसी भी बिंदु की तलाश नहीं है बस इसे आगे बढ़ा रहा हूं।
किसी कारण से 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...
}
};
एक भी नहीं है 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) } }
यह कोड हेडसेट प्रोफाइल के लिए है, शायद यह अन्य प्रोफाइल के लिए भी काम करेगा। सबसे पहले आपको प्रोफ़ाइल श्रोता (कोटलिन कोड) प्रदान करना होगा:
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
मैं वास्तव में एक डिवाइस की कनेक्शन स्थिति लाने के लिए एक रास्ता ढूंढ रहा था, न कि कनेक्शन घटनाओं को सुनने के लिए। यहाँ मेरे लिए क्या काम किया गया है:
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
}