Entiendo cómo obtener una lista de dispositivos emparejados, pero ¿cómo puedo saber si están conectados?
Debe ser posible ya que los veo en la lista de dispositivos Bluetooth de mi teléfono e indica su estado de conexión.
Entiendo cómo obtener una lista de dispositivos emparejados, pero ¿cómo puedo saber si están conectados?
Debe ser posible ya que los veo en la lista de dispositivos Bluetooth de mi teléfono e indica su estado de conexión.
Respuestas:
Agregue permiso de bluetooth a su AndroidManifest,
<uses-permission android:name="android.permission.BLUETOOTH" />
A continuación, utilice filtros intención de escuchar el ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
y ACTION_ACL_DISCONNECTED
transmisiones:
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
}
}
};
Algunas notas:
En mi caso de uso, solo quería ver si hay un auricular Bluetooth conectado para una aplicación de VoIP. La siguiente solución funcionó para mí:
public static boolean isBluetoothHeadsetConnected() {
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
&& mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
}
Por supuesto, necesitará el permiso de Bluetooth:
<uses-permission android:name="android.permission.BLUETOOTH" />
Muchas gracias a Skylarsutton por su respuesta. Estoy publicando esto como una respuesta a la suya, pero como estoy publicando un código no puedo responder como comentario. Ya voté a favor de su respuesta, así que no estoy buscando ningún punto. Solo pagando por adelantado.
Por alguna razón, Android Studio no pudo resolver BluetoothAdapter.ACTION_ACL_CONNECTED. ¿Quizás quedó obsoleto en Android 4.2.2? Aquí hay una modificación de su código. El código de registro es el mismo; el código del receptor difiere ligeramente. Lo uso en un servicio que actualiza una marca de conexión Bluetooth a la que hacen referencia otras partes de la aplicación.
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...
}
};
Hay una función isConnected en la API del sistema BluetoothDevice en https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java
Si desea saber si un dispositivo delimitado (emparejado) está conectado actualmente o no, la siguiente función funciona bien para mí:
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")
y 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) } }
Este código es para los perfiles de auriculares, probablemente también funcione para otros perfiles. Primero debe proporcionar un escucha de perfil (código 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
}
}
}
Luego, mientras verifica el bluetooth:
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}
Se necesita un poco de tiempo hasta que se llama a onSeviceConnected. Después de eso, puede obtener la lista de dispositivos de auriculares conectados en:
mBluetoothHeadset!!.connectedDevices
BluetoothAdapter.getDefaultAdapter().isEnabled
-> devuelve verdadero cuando bluetooth está abierto
val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as
AudioManager
audioManager.isBluetoothScoOn
-> devuelve verdadero cuando el dispositivo está conectado
Realmente estaba buscando una forma de obtener el estado de conexión de un dispositivo, no escuchar los eventos de conexión. Esto es lo que funcionó para mí:
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
}