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
- Exportar mis datos en el archivo CSV desde la aplicación Android
- Cómo recibir la última emisión de secuencia al llamar a rx.Observable.sample ()?
- Función onFocusChanged de Android nunca llamada
- Imprimir el símbolo de copyright en TextView
- ¿Cómo un InputStream, InputStreamReader y BufferedReader trabajan juntos en Java?
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.
- Inspeccionar elementos de la interfaz de usuario en Android
- Recyclerviews en ViewPager
- Box2d Comprobar Collision / Overlaping en cualquier momento
- Descargar html source android?
- ¿Cómo determinar el recuento de métodos de la aplicación?
- Iniciar sesión con el SDK de Android de Facebook y Proguard
- Cómo hacer animación de traducción para cada elemento de vista de lista
- Problema con el espacio en blanco de Android TabWidget
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.
- ¿Deberíamos llamar realmente getLoaderManager (). InitLoader en onActivityCreated, lo que hace que onLoadFinished sea llamado dos veces
- La facturación en la aplicación no funciona: "IAB Helper no está configurado"