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.
- IOException: error de lectura, socket podría cerrarse - Bluetooth en Android 4.3
- Cómo encontrar bluetooth mac dirección de forma programática en Android api nivel 19
- Android 4.4.2 anclaje inverso en MacBook Air vía Bluetooth PAN - no se conecta a Internet
- Envío de un archivo utilizando Bluetooth OBEX Perfil de inserción de objetos (OPP)
- Android 2.1 Detectar audio Bluetooth conectar / desconectar
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 .
- Cómo obtener la dirección MAC del dispositivo conectado bluetooth en android
- AntiVirus mata mi aplicación
- Cómo hacer que una llamada entrante en mi dispositivo móvil active una acción en mi PC
- ¿Cómo recuperar la información del dispositivo Bluetooth con el selector de dispositivos Bluetooth de Android?
- Cómo simular el bluetooth en el emulador de Android
- Dieciséis vibradores Bluetooth conectados a un teléfono Android
- El descubrimiento de servicio falló la excepción utilizando Bluetooth en Android
- Android recibe demasiados datos de depuración de Bluetooth
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;