Android 4.0 y 4.1 problemas de Bluetooth. Detectar los comms rotos y eliminar el emparejamiento

Hola a todos ,

Entiendo que la pila bluetooth de Android (bluez) fue reemplazada en 4.2. A pesar de que podría haber arreglado una gran cantidad de los problemas anteriores, debido a la necesidad de apoyar versiones anteriores, todavía tengo que luchar contra ellos.

Apreciaría enormemente si alguien ha tratado con estos problemas antes y podría arrojar algo de luz.

Problema # 1 – No se pueden detectar comunicaciones rotas (4.0 y 4.1 Android, Bluez bluetooth stack)

La aplicación bluetooth se conecta a nuestro propio dispositivo SPP personalizado (usamos el UUID estándar). Utiliza un servicio bluetooth que se ejecuta en su propio proceso. Es necesario que esta aplicación se ejecuta durante varias horas haciendo trabajo bluetooth.

Durante el ahorro de energía / bloqueo de pantalla , la aplicación se mantiene viva mientras los datos están llegando a través de la radio bluetooth , y también comprobar periódicamente con un conjunto de alarmas, donde solicito tiempo de CPU para volver a conectar y seguir haciendo el trabajo (si es necesario)

Ahora; El sistema está funcionando bien la mayor parte del tiempo, pero, en algunas situaciones raras cuando la pantalla está bloqueada y en modo de ahorro de energía , por razones que no entiendo, al escribir en la salida de flujo (bluetooth socket), todo parece Para pasar sin que se detecte una conexión rota. El dispositivo spp todavía indica que la conexión y el emparejamiento es válido pero no recibe nada.

En el lado de Android, los registros muestran una llamada nativa a BluetoothSocket.cpp :: writeNative (asumiendo que está directamente relacionado con la pila bluez bluetooth) que parece escribir los bytes correctamente en la radio bluetooth sin reportar ningún tipo de error.

Pieza de código que escribe en el flujo de salida:

public void write(byte[] bytes) { try { Log.d(LOGGER.TAG_BLUETOOTH," bluetooth bytes to write : "+bytes); mmOutStream.write(bytes); mmOutStream.flush(); Log.d(LOGGER.TAG_BLUETOOTH," bluetooth bytes written : "+bytes); } catch (IOException e) { e.printStackTrace(); } } 

Logcat:

D / com.our.app.bluetooth (8711): envío de bytes: [B @ 41e0bcf8

D / com.our.app.bluetooth (8711): bytes bluetooth para escribir: [B @ 41e0bcf8

V / BluetoothSocket.cpp (8711): writeNative

D / com.our.app.bluetooth (8711): bytes bluetooth escritos: [B @ 41e0bcf8

Preguntas – ¿Es correcto suponer que, aparte de la comprobación de nivel de aplicación y los latidos del corazón, los comms rotos deben ser detectados en las operaciones de E / S de socket como en este caso? ¿O podría la radio bluetooth sólo bajar durante el ahorro de energía?

Edición # 2 – Caída repentina de la lista de emparejamiento.

En Android 4.0 y 4.1, los dispositivos en algunos casos, obtener inexplicablemente caído de la lista de emparejamiento . Incluso esto es raro y algo sólo en algunos dispositivos particulares … es un caso en el que impide que el teléfono para volver a emparejarse y conectarse fácilmente.

Me doy cuenta de que el dispositivo SPP pares correctamente, pero a veces, los dispositivos Android muestra el mensaje "No se puede vincular a dispositivo X, PIN o contraseña incorrecta".

Nota: Para versiones android <4.2 usamos comas inseguros ( createInsecureRfcommSocket , debido a otros problemas de conexión android para esta versión).

Preguntas – ¿Con qué frecuencia debe actualizarse este PIN / contraseña durante una sesión?

Esto podría muy bien ser un error en nuestro dispositivo SPP, pero en la posibilidad de que no es, cualquier idea?

Gracias un millón .

Esto funciona android 4.4.2 en el nexo 7

 private boolean refreshDeviceCache(BluetoothGatt gatt){ try { BluetoothGatt localBluetoothGatt = gatt; Method localMethod = localBluetoothGatt.getClass().getMethod("refresh", new Class[0]); if (localMethod != null) { boolean bool = ((Boolean) localMethod.invoke(localBluetoothGatt, new Object[0])).booleanValue(); return bool; } } catch (Exception localException) { Log.e(TAG, "An exception occured while refreshing device"); } return false;} public boolean connect(final String address) { if (mBluetoothAdapter == null || address == null) { Log.w(TAG,"BluetoothAdapter not initialized or unspecified address."); return false; } // Previously connected device. Try to reconnect. if (mBluetoothGatt != null) { Log.d(TAG,"Trying to use an existing mBluetoothGatt for connection."); if (mBluetoothGatt.connect()) { return true; } else { return false; } } final BluetoothDevice device = mBluetoothAdapter .getRemoteDevice(address); if (device == null) { Log.w(TAG, "Device not found. Unable to connect."); return false; } // We want to directly connect to the device, so we are setting the // autoConnect // parameter to false. mBluetoothGatt = device.connectGatt(MyApp.getContext(), false, mGattCallback)); refreshDeviceCache(mBluetoothGatt); Log.d(TAG, "Trying to create a new connection."); return true; 
  • Java.lang.RuntimeException: No se pudo abrir el par de canales de entrada
  • ¿Hay una manera de conectar el dispositivo android a una impresora externa a través de Bluetooth?
  • Bluetooth: ¿La transferencia de la llamada de la fuente al fregadero?
  • Hacer un hilo que cancela una llamada de InputStream.read () si ha pasado el tiempo 'x'
  • Si se crea un vínculo con un dispositivo Bluetooth LE
  • Android: Conexión entre el servidor y el cliente
  • No se puede conectar a bluetooth Dispositivos de dispositivos de salud utilizando Android BluetoothProfile
  • Cómo grabar audio desde un auricular bluetooth (startBluetoothSco ())
  • Cómo borrar el búfer de InputStream bluetooth
  • 16s tiempo hasta que se reconoce la solicitud desconectada del bluetooth
  • El conector Bluetooth de Android se bloquea
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.