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);
}
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)) {
...
}
else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
...
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
...
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
...
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
...
}
}
};
Kilka uwag:
- Nie ma możliwości pobrania listy podłączonych urządzeń podczas uruchamiania aplikacji. Interfejs API Bluetooth nie pozwala na QUERY, zamiast tego umożliwia słuchanie CHANGES.
- Drobnym obejściem powyższego problemu byłoby pobranie listy wszystkich znanych / sparowanych urządzeń ... a następnie próba połączenia się z każdym z nich (w celu ustalenia, czy masz połączenie).
- Alternatywnie możesz mieć usługę działającą w tle, która będzie obserwować interfejs API Bluetooth i zapisywać stany urządzeń na dysku, aby aplikacja mogła ich użyć w późniejszym terminie.
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" />
źródło
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... } };
źródło
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); } }
źródło
bluetoothManager.getConnectionState(device, BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTED
?val m: Method = device.javaClass.getMethod("isConnected")
ival 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
źródło
BluetoothAdapter.getDefaultAdapter().isEnabled
-> zwraca prawdę, gdy Bluetooth jest otwartyval audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.isBluetoothScoOn
-> zwraca prawdę, gdy urządzenie jest podłączoneźródło
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 }
źródło