Bluetooth no se conecta en 4.4.2

Tengo un dispositivo Bluetooth que se ha conectado a todas las versiones de Android que he probado antes de 4.4.2. Ahora, no se está conectando en el Galaxy Tab 4 o el S3. La lengüeta 3 conecta bien con 4.1.2. El problema parece ocurrir en el AcceptThread al intentar inicializar el BluetoothSocket . El código que estoy usando está basado en el ejemplo de chat en el sdk.

Mi código Aceptar

 private class AcceptThread extends Thread { // The local server socket private BluetoothServerSocket mmServerSocket; public boolean successInit = false; public AcceptThread() { closeAllConnections(); BluetoothServerSocket tmp = null; // Create a new listening server socket while(!successInit) { try { tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID); successInit= true; Log.i("TAG", "Socket Server Created"); } catch(Exception e) { Log.i("TAG", e.getMessage()); successInit = false; } } mmServerSocket = tmp; } public void run() { BluetoothSocket socket = null; // Listen to the server socket if we're not connected Log.i("BluetoothComService", String.valueOf(mState)); while (mState != STATE_CONNECTED) { try { // This is a blocking call and will only return on a // successful connection or an exception mAdapter.cancelDiscovery(); socket = BluetoothAdapter.getDefaultAdapter() .getRemoteDevice(getThermMAC()) .createRfcommSocketToServiceRecord(UUID .fromString("00001101-0000-1000-8000-00805F9B34FB")); // socket = mmServerSocket.accept(); // here socket might be closed or timeout Log.e("BluetoothComService", "No accept Exception"); }catch (IOException e) { Log.e("TAG", e.getMessage()); } 

getThermMAC() arriba es mi método para devolver la dirección del dispositivo enlazado.

Los errores

En run() , si utilizo

 socket=BluetoothAdapter.getDefaultAdapter() .getRemoteDevice(getThermMAC()) .createRfcommSocketToServiceRecord(UUID .fromString("00001101-0000-1000-8000-00805F9B34FB")); 

Entonces me da un NPE en la línea 501 de BluetoothSocket.java en el marco de Android que es esta línea

 int left = b.length; 

Por lo tanto, parece que b es null pero no parece ser después de la depuración. b es un byte[] que se envía desde mi clase BluetoothService que envía un nuevo byte[] inicializado desde el ConnectedThread exactamente igual que el ejemplo sdk y como he estado haciendo en las versiones anteriores.

Si comento eso y trato de usarlo

 socket = mmServerSocket.accept(); 

Que ha estado trabajando en el pasado, entonces me

 bt socket is not in listen state 

Por lo tanto, no sé cómo ponerlo en "escuchar estado" o por qué no sería. ¿Alguien ha experimentado esto o sabe cómo solucionarlo? O cómo evitar obtener el NPE si utilizo el primer fragmento (si eso es correcto).

encontré

Cuando estaba recibiendo una IOException encontré este post que me llevó aquí, pero esto no me ha llegado a ninguna parte.

Aviso: El mensaje de recompensa dice 4.4.4 pero es 4.4.2 en la pestaña 4

Errores del dispositivo

También noto estos errores de Bluetooth cuando primero conecto mi dispositivo a la computadora a través de USB

 09-05 15:18:03.217: E/BluetoothServiceJni(15148): SOCK FLAG = 0 *********************** 09-05 15:18:13.177: E/BluetoothServiceJni(15148): SOCK FLAG = 0 *********************** 09-05 15:18:13.217: E/BluetoothServiceJni(15148): SOCK FLAG = 0 *********************** 

Pero no he podido averiguar qué significa esa bandera.

Me doy cuenta de que hay errores conocidos en la pila 4.x de BT ( ver uno de los muchos informes de errores )

minSDK es actualmente 10. Aunque, si encuentro una solución de trabajo entonces puedo trabajar alrededor de eso.

Prueba este código, esto está funcionando android 4.4.2 on nexus 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; 

}

También he utilizado los pasos de conexión con el mismo código, pero que podría funcionar sólo para Smart Android dispositivo.

Puede obtener el objeto BluetoothDevice del dispositivo en particular que desea conectar. Después de que usted puede utilizar el método de conexión y desconexión de BluetoothHeadset vía reflexión para conectarse al BluetoothDevice perticular.

 Class<?> BTHeadset = Class.forName("android.bluetooth.BluetoothHeadset"); Method conn = BTHeadset.getMethod("connect", new Class[] {BluetoothDevice.class}); conn.invoke(BTHeadset, new Object[] {btDev}); 

Mismo código que puede utilizar para desconectar un dispositivo utilizando el método de desconexión a través de la reflexión.

  • ¿Utilizar un carácter unicode en un archivo .java?
  • Inicialización estática en OpenCV Android
  • Manipule los bytes alfa de Java / color de Android int
  • ¿Cuándo muere la instancia de Activity?
  • Android: java.lang.OutOfMemoryError:
  • Todos los elementos de An ArrayList cambian cuando se agrega uno nuevo?
  • Calcular la distancia real recorrida por el móvil
  • No hay carpeta de menú en el proyecto de estudio de Android
  • Android: solicitud HTTP de Google Drive
  • Error al iniciar Studio de Android
  • ¿Cómo puedo reiniciar un hilo en java / Android desde un botón?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.