studio scanner libreria ejemplo dispositivos devices detectar java android android-bluetooth

java - scanner - libreria bluetooth android



Bluetooth no se conecta en 4.4.2 (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 pestaña 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 se basa en el ejemplo de chat en el SDK.

Mi código de aceptación

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() anterior es mi método para devolver la dirección del dispositivo vinculado.

Los errores

En run() , si uso

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

luego obtengo una 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 estar después de la depuración. b es un byte[] que se envía desde mi clase de Servicio BluetoothService y que envía un nuevo byte[] inicializado byte[] desde ConnectedThread tal como lo hace el ejemplo sdk y lo he estado haciendo en versiones anteriores.

Si lo comento y trato de usar

socket = mmServerSocket.accept();

que ha estado trabajando en el pasado, entonces me sale

bt socket is not in listen state

Entonces, no sé cómo ponerlo en "estado de escucha" o por qué no lo sería. ¿Alguien ha experimentado esto o sabe cómo solucionarlo? O cómo evitar la NPE si uso el primer fragmento (si eso es correcto).

encontré

Cuando recibí una IOException , encontré esta publicación que me llevó hasta here pero no me ha llevado 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 me doy cuenta de estos errores de Bluetooth cuando conecto por primera vez mi dispositivo a la computadora mediante 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 BT 4.x ( vea uno de los muchos informes de errores )

minSDK es actualmente 10. Sin embargo, si encuentro una solución que funcione, puedo solucionarlo.


Pruebe este código, este es Android 4.4.2 en 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 usado los pasos de conexión utilizando el mismo código, pero eso podría funcionar solo para dispositivos Smart Android.

puede obtener el objeto BluetoothDevice del dispositivo en particular que desea conectar. después de eso, puede utilizar el método de conexión y desconexión de BluetoothHeadset a través de la reflexión para conectarse al dispositivo Bluetooth específico.

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

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