Rozumiem, jak uzyskać listę sparowanych urządzeń, ale jak mogę sprawdzić, czy są połączone?
Musi to być możliwe, ponieważ widzę je na liście urządzeń Bluetooth mojego telefonu i określa ich stan połączenia.
Rozumiem, jak uzyskać listę sparowanych urządzeń, ale jak mogę sprawdzić, czy są połączone?
Musi to być możliwe, ponieważ widzę je na liście urządzeń Bluetooth mojego telefonu i określa ich stan połączenia.
Odpowiedzi:
Dodaj uprawnienia Bluetooth do pliku AndroidManifest,
<uses-permission android:name="android.permission.BLUETOOTH" />
Następnie użyć filtrów zamiaru słuchać ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
i ACTION_ACL_DISCONNECTED
transmisjach:
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
}
}
};
Kilka uwag:
W moim przypadku chciałem tylko sprawdzić, czy zestaw słuchawkowy Bluetooth jest podłączony do aplikacji VoIP. U mnie zadziałało następujące rozwiązanie:
public static boolean isBluetoothHeadsetConnected() {
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
&& mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
}
Oczywiście będziesz potrzebować pozwolenia Bluetooth:
<uses-permission android:name="android.permission.BLUETOOTH" />
Wielkie dzięki dla Skylarsutton za odpowiedź. Wysyłam to jako odpowiedź na jego, ale ponieważ wysyłam kod, nie mogę odpowiedzieć jako komentarz. Głosowałem już za jego odpowiedzią, więc nie szukam żadnych punktów. Po prostu płacę dalej.
Z jakiegoś powodu BluetoothAdapter.ACTION_ACL_CONNECTED nie może zostać rozwiązany przez Android Studio. Być może został wycofany w systemie Android 4.2.2? Oto modyfikacja jego kodu. Kod rejestracyjny jest taki sam; kod odbiornika różni się nieznacznie. Używam tego w usłudze, która aktualizuje flagę połączenia Bluetooth, która odnosi się do innych części aplikacji.
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...
}
};
Jest isconnected funkcja w BluetoothDevice systemu API w https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java
Jeśli chcesz wiedzieć, czy powiązane (sparowane) urządzenie jest obecnie podłączone, czy nie, następująca funkcja działa dobrze dla mnie:
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")
i 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) } }
Ten kod jest przeznaczony dla profili zestawu słuchawkowego, prawdopodobnie będzie działać również dla innych profili. Najpierw musisz podać odbiornik profilu (kod Kotlin):
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
}
}
}
Następnie podczas sprawdzania bluetooth:
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}
Wywołanie onSeviceConnected zajmuje trochę czasu. Następnie możesz uzyskać listę podłączonych urządzeń słuchawkowych z:
mBluetoothHeadset!!.connectedDevices
BluetoothAdapter.getDefaultAdapter().isEnabled
-> zwraca prawdę, gdy Bluetooth jest otwarty
val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as
AudioManager
audioManager.isBluetoothScoOn
-> zwraca prawdę, gdy urządzenie jest podłączone
Naprawdę szukałem sposobu, aby pobrać stan połączenia urządzenia, a nie słuchać zdarzeń połączenia. Oto, co zadziałało dla mnie:
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
}