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.