Добавьте разрешение Bluetooth на свой 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);
}
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)) {
...
}
}
};
Несколько примечаний:
- Невозможно получить список подключенных устройств при запуске приложения. API Bluetooth не позволяет выполнять ЗАПРОС, вместо этого он позволяет прослушивать ИЗМЕНЕНИЯ.
- Хитрым решением вышеуказанной проблемы было бы получить список всех известных / сопряженных устройств ... затем попытаться подключиться к каждому из них (чтобы определить, подключены ли вы).
- В качестве альтернативы у вас может быть фоновая служба, отслеживающая API Bluetooth и записывающая состояния устройства на диск, чтобы ваше приложение могло использовать их позже.
В моем случае использования я только хотел увидеть, подключена ли гарнитура Bluetooth для приложения VoIP. У меня сработало следующее решение:
public static boolean isBluetoothHeadsetConnected() { BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled() && mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED; }
Конечно, вам понадобится разрешение Bluetooth:
<uses-permission android:name="android.permission.BLUETOOTH" />
источник
Большое спасибо Скайларсаттон за его ответ. Я отправляю это как ответ на его, но поскольку я публикую код, я не могу ответить как комментарий. Я уже поддержал его ответ, поэтому не ищу никаких очков. Просто платите вперед.
По какой-то причине BluetoothAdapter.ACTION_ACL_CONNECTED не может быть разрешен Android Studio. Возможно, он устарел в Android 4.2.2? Вот модификация его кода. Регистрационный код тот же; код приемника немного отличается. Я использую это в службе, которая обновляет флаг Bluetooth-соединения, который упоминается в других частях приложения.
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... } };
источник
В системном API BluetoothDevice есть функция isConnected в 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) } }
Этот код предназначен для профилей гарнитуры, возможно, он будет работать и для других профилей. Сначала вам нужно предоставить прослушиватель профиля (код 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 } } }
Затем при проверке bluetooth:
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET) if (!mBluetoothAdapter.isEnabled) { return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) }
До вызова onSeviceConnected требуется некоторое время. После этого вы можете получить список подключенных гарнитур:
mBluetoothHeadset!!.connectedDevices
источник
BluetoothAdapter.getDefaultAdapter().isEnabled
-> возвращает истину, когда bluetooth открытval audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.isBluetoothScoOn
-> возвращает истину при подключении устройстваисточник
Я действительно искал способ получить статус подключения устройства, а не слушать события подключения. Вот что у меня сработало:
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 }
источник