¿Cómo puedo saber mediante programación si un dispositivo Bluetooth está conectado?

Resuelto dchappelle asked hace 54 años • 8 respuestas

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 el estado de su conexión.

dchappelle avatar Jan 01 '70 08:01 dchappelle
Aceptado

Agregue el permiso de Bluetooth a su AndroidManifest,

<uses-permission android:name="android.permission.BLUETOOTH" />

Luego use filtros de intención para escuchar las transmisiones de ACTION_ACL_CONNECTED, ACTION_ACL_DISCONNECT_REQUESTEDy :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
        }
    }
};

Algunas notas:

  • No hay forma de recuperar una lista de dispositivos conectados al inicio de la aplicación. La API de Bluetooth no le permite realizar consultas , sino que le permite escuchar los cambios .
  • Una solución alternativa al problema anterior sería recuperar la lista de todos los dispositivos conocidos/emparejados... y luego intentar conectarse a cada uno (para determinar si está conectado).
  • Alternativamente, puede hacer que un servicio en segundo plano observe la API de Bluetooth y escriba los estados del dispositivo en el disco para que su aplicación los use en una fecha posterior.
Skylar Sutton avatar Jan 17 '2011 18:01 Skylar Sutton

En mi caso de uso, solo quería ver si hay conectados unos auriculares Bluetooth para una aplicación VoIP. La siguiente solución funcionó para mí.

Kotlin:

fun isBluetoothHeadsetConnected(): Boolean {
    val mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
    return (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled
        && mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED)
}

Java:

public static boolean isBluetoothHeadsetConnected() {
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
            && mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
} 

Por supuesto, necesitarás el permiso de Bluetooth:

<uses-permission android:name="android.permission.BLUETOOTH" />

jobbert avatar Dec 16 '2016 09:12 jobbert