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

7 minutos de lectura

¿Como puedo saber mediante programacion si un dispositivo Bluetooth esta
dchapelle

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 enumerados en la lista de dispositivos Bluetooth de mi teléfono e indica su estado de conexión.

1646756231 721 ¿Como puedo saber mediante programacion si un dispositivo Bluetooth esta
Skylar Sutton

Agregue el permiso de Bluetooth a su AndroidManifest,

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

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

  • No hay forma de recuperar una lista de dispositivos conectados al inicio de la aplicación. La API de Bluetooth no le permite consultaen su lugar te permite escuchar cambios.
  • Una solución engañosa 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 tener un servicio en segundo plano que 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.

  • Esto es bueno mientras mi aplicación se esté ejecutando, pero ¿cómo puedo obtener una lista actualizada?

    – dchappelle

    18 de enero de 2011 a las 16:45

  • ¿Cómo planea ejecutar el código sin que su aplicación se “ejecute”? Si quiere decir que necesita acceder a esto desde algo que no sea una actividad… vaya a Google Android Services, cree uno de esos para escuchar las transmisiones y consérvelo en una lista.

    -Skylar Sutton

    18 de enero de 2011 a las 19:44

  • Puedo escuchar las intenciones PERO, ¿cómo puedo obtener la lista inicial de dispositivos Bluetooth conectados? Si alguno ya está conectado en el momento en que se inicia mi Actividad o Servicio, no lo sabré. Me imagino (espero) que estos datos estén disponibles en alguna parte. No me gustaría tener que crear un servicio (que se ejecute constantemente mientras el teléfono esté encendido) solo para escuchar estas intenciones.

    – dchappelle

    19 de enero de 2011 a las 13:28

  • No hay forma de recuperar la lista de dispositivos conectados al inicio de la aplicación. La API de Bluetooth solo le permitirá escuchar los cambios de conexión. Entonces, sí, la única forma de hacerlo es crear un servicio de larga duración y agregar/eliminar a una lista pública. Es una gran queja de muchos desarrolladores. Según sus necesidades de rendimiento, puede recuperar la lista de dispositivos emparejados e intentar conectarse a cada uno. Si falla, no está disponible. Sin embargo, una palabra de advertencia: .connect() es una operación de bloqueo.

    -Skylar Sutton

    20 de enero de 2011 a las 18:57

  • @skylarsutton +1 Muchas gracias por esta respuesta, me ayudó a comenzar con bluetooth

    – AgenteKnopf

    14 de febrero de 2012 a las 17:23


1646756232 151 ¿Como puedo saber mediante programacion si un dispositivo Bluetooth esta
berberto

En mi caso de uso, solo quería ver si un auricular Bluetooth está conectado para una aplicación de 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" />

  • Este es el que estaba buscando. Solo para verificar al iniciar si el Bluetooth está conectado o no. ¡Gracias funcionó!

    – sud007

    19 de agosto de 2017 a las 5:44

  • Esta solución funcionó hasta que actualicé Android Studio a la versión 2021.1.1. Ahora getProfileConnectionState(BluetoothHeadset.HEADSET) la llamada muestra el error “La llamada requiere permiso que puede ser rechazado por el usuario: el código debe verificar explícitamente si el permiso está disponible (con checkPermission) o manejar explícitamente una SecurityException potencial”. El permiso que se requiere es Manifest.permission.BLUETOOTH_CONNECT.

    – Juha

    27 de enero a las 8:10

  • Veo un problema en el que aparece un Samsung Galaxy Watch4 como auricular con esta llamada aunque device.bluetoothClass.hasService(BluetoothClass.Service.AUDIO)=false. Estoy tratando de averiguar cómo determinar si hay algún dispositivo conectado que admita audio, pero el isConnected la llamada es solo SystemApi. Actualmente puedo ver todos los dispositivos vinculados, pero no puedo saber si están conectados o no, por lo que no puedo determinar si un auricular está realmente conectado o solo el reloj (es decir, tengo auriculares que no están conectados). ¿Alguien tiene una solución para esto?

    – no es mi estilo

    15 de febrero a las 21:29


1646756234 813 ¿Como puedo saber mediante programacion si un dispositivo Bluetooth esta
pmont

Por algún motivo, Android Studio no pudo resolver BluetoothAdapter.ACTION_ACL_CONNECTED. ¿Quizás quedó obsoleto en Android 4.2.2?

Aquí hay una modificación del código de Skylarsutton (Muchas gracias a Skylarsutton por su respuesta). El código de registro es el mismo; el código del receptor difiere ligeramente. Lo uso en un servicio que actualiza una bandera conectada por 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...
    }
};

  • tu código es correcto; no estaba en desuso en 4.2.2. La clase BluetoothAdapter no contiene ACTION_ACL_CONNECTED. Esa cadena está en la clase BluetoothDevice.

    – RobLabs

    12 de agosto de 2013 a las 3:05


  • ¡Gracias por aclarar eso!

    – pmont

    12 de agosto de 2013 a las 4:39

1646756236 527 ¿Como puedo saber mediante programacion si un dispositivo Bluetooth esta
LW

Hay un está conectado función 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 vinculado (emparejado) está actualmente conectado 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);
    }
}

1646756238 994 ¿Como puedo saber mediante programacion si un dispositivo Bluetooth esta
usuario5902306

Este código es para los perfiles de auriculares y probablemente también funcione para otros perfiles.

Primero debe proporcionar un oyente 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 revisa Bluetooth:

mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
    return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}

Toma un poco de tiempo hasta que se llama a onSeviceConnected. Después de eso, puede obtener la lista de los dispositivos de auriculares conectados de:

mBluetoothHeadset!!.connectedDevices

1646756239 527 ¿Como puedo saber mediante programacion si un dispositivo Bluetooth esta
connorbode

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
}

1646756240 230 ¿Como puedo saber mediante programacion si un dispositivo Bluetooth esta
Pedro Mortensen

BluetoothAdapter.getDefaultAdapter().isEnabled -> devuelve verdadero cuando Bluetooth está abierto.

val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager

audioManager.isBluetoothScoOn -> devuelve verdadero cuando un dispositivo conectado

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad