recibir - detectar dispositivos bluetooth android studio
RFCOMM_CreateConnection-estado ya abierto: 2, estado de RFC: 4, estado de MCB: 5 (1)
-------- SOLUCIONADO -------------- Estoy escribiendo una aplicación de Android que se conecta a un dispositivo a través de bluetooth utilizando RFCOMM. Utilizo el ejemplo de BluetoothChat como base para establecer una conexión y todo funciona perfectamente la mayor parte del tiempo. A veces no puedo volver a conectar debido a un mensaje de que el socket ya está abierto: RFCOMM_CreateConnection - estado ya abierto: 2, estado RFC: 4, estado MCB: 5 Esto tiende a suceder si me conecto al dispositivo, cierre la aplicación (llame a Destroy ( )), vuelva a abrirlo e intente conectarse de nuevo, lo que da como resultado lo anterior.
Utilizo este método para conectarme en ConnectThread (ejemplo de ref.BluetoothChat): Método m = device.getClass (). GetMethod ("createRfcommSocket", new Class [] {int.class}); tmp = (BluetoothSocket) m.invoke (dispositivo, Integer.valueOf (1));
mmSocket = tmp;
Lo único que resuelve esto es apagar / encender el bluetooth del teléfono Android. Esto me lleva a creer que el zócalo no se está cerrando en Destroy () pero sigo llamando para cerrar todos los hilos como se muestra en el ejemplo antes mencionado. Cualquier idea se apruebe.
Me encontré con este también, y aquí está la respuesta que encontré:
Este error puede ocurrir si abre y cierra una conexión de socket bluetooth varias veces.
Solución
A partir del Nivel 14 de API, hay un Método en BluetoothSocket llamado isConected () , que devuelve verdadero, si este socket ya está conectado y es falso, de lo contrario, aquí el extracto original de la API:
Obtenga el estado de conexión de este socket, es decir, si hay una conexión activa con el dispositivo remoto.
Para los niveles API <14, puede solucionar este problema al poner en espera el hilo Bluetooth Handling Thread después de cerrar la conexión: 1000 ms deberían ser suficientes, aquí hay un ejemplo (btDevice es del tipo BluetoothDevice y se ha inicializado antes del fragmento de código abajo):
try {
//Open the socket to an SPP device (UUID taken from Android API for createRfcommSocketToServiceRecord)
BluetoothSocket btSocket = btDevice.createRfcommSocketToServiceRecord("00001101-0000-1000-8000-00805F9B34FB");
//Connect to the socket
btSocket.connect();
//Close the socket
btSocket.close();
//Sleep time of 1000ms after closing the socket
SystemClock.sleep(POST_RESET_DELAY);
} catch (Throwable e) {
// Log error message
}
Ps En lugar de SystemClock.sleep también puede usar Thread.sleep; sin embargo, la suspensión de SystemCock no se puede interrumpir, mientras que el Thread.sleep se puede interrumpir, por lo que depende de su caso de uso, qué opción se adapta mejor a su propósito.
Fuente: Louis A. Prado