gpt4 book ai didi

java - 尝试连接 BluetoothGatt 时回调中出现未处理的异常

转载 作者:行者123 更新时间:2023-12-01 09:14:50 27 4
gpt4 key购买 nike

我正在尝试连接到外围设备。当我在 Scancallback 中找到所需的设备时,我会向我的处理程序发送一条包含该设备的消息。

11-16 10:31:12.471 25907-25907/I/BleManager: START SCAN
11-16 10:31:12.471 25907-25907/ D/BluetoothAdapter: startLeScan(): null
11-16 10:31:12.481 25907-25918/ D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
11-16 10:31:12.731 25907-25918/ W/BleOlderScanCallback: Try to connect device
11-16 10:31:12.731 25907-25907/ I/BleManager: STOP SCAN
11-16 10:31:12.731 25907-25907/ D/BluetoothAdapter: stopLeScan()
11-16 10:31:12.741 25907-25907/ I/BleManager: connect device
11-16 10:31:12.741 25907-25907/ I/Runnable: connectGatt
11-16 10:31:12.741 25907-25907/ D/BluetoothGatt: connect() - device: [hidden], auto: false
11-16 10:31:12.741 25907-25907/ D/BluetoothGatt: registerApp()
11-16 10:31:12.741 25907-25907/ D/BluetoothGatt: registerApp() - UUID=[hidden]
11-16 10:31:12.751 25907-25919/ D/BluetoothGatt: onClientRegistered() - status=0 clientIf=5
11-16 10:31:15.441 25907-25918/ D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=5 device=[hidden]
11-16 10:31:15.441 25907-25918/ W/BluetoothGatt: Unhandled exception in callback java.lang.NullPointerException

at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:168)
at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:71)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)

这是我的代码:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)

public class BleOlderScanCallback implements BluetoothAdapter.LeScanCallback {

private static final String TAG = BleOlderScanCallback.class.getSimpleName();

private static final int START_BYTE_I = 2;
private static final int MAC_BYTE_I = 7;
private static final int MAC_SIZE = 6;

private Handler handler;
private String mac;

public BleOlderScanCallback(Handler handler, String mac) {
this.handler = handler;
this.mac = mac;
}
protected void onResult(BluetoothDevice device, byte[] scanRecord){
byte[] macBytes;
String mac;

if (device != null && scanRecord != null) {
macBytes = new byte[MAC_SIZE];
System.arraycopy(scanRecord, MAC_BYTE_I, macBytes, 0, MAC_SIZE); // copy MAC_SIZE positions (since index MAC_BYTE_I) of array scanRecord to array mac
mac = formatMAC(macBytes);

Logg.i(TAG, mac + " device: " + device.getName());
if (this.mac.equals(mac)) {
Logg.w(TAG, "Try to connect device");
handler.obtainMessage(BleHandler.SCANNED_DEVICE, device).sendToTarget();
}
else{
Logg.i(TAG, "Other mac ");
}
}
}

/**
* API lower Lollipop (21)
* @param device
* @param rssi
* @param scanRecord
*/
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
onResult(device, scanRecord);
}
}

这是我的处理程序。它调用我的管理器类来连接BluetoothGatt

public class BleHandler extends Handler {
private static final String TAG = BleHandler.class.getSimpleName();

public static final int SCANNED_DEVICE = 1;

private BleManager bleManager; // should I use WeakReference?

public BleHandler (BleManager bleManager){
this.bleManager = bleManager;
}

@Override
public void handleMessage(Message message){
BluetoothDevice device;
switch (message.what){
case SCANNED_DEVICE:
bleManager.stopBtScan();
device = (BluetoothDevice) message.obj;
bleManager.connect(device);
break;
}
}
}

在我的管理器类中,连接方法如下所示:

    public void connect(final BluetoothDevice device){
Logg.i(TAG, "connect device");
if (device == null){
Logg.i(TAG, "device to connect is null");
return;
}
Handler handler = new Handler(context.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Logg.i("Runnable", "connectGatt");
bluetoothGatt = device.connectGatt(context, false, bluetoothGattCallback);
}
});
}

我重写了BluetoothGatt.onConnectionStateChange,但执行没有到达这里

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class BleGattCallback extends BluetoothGattCallback {
private static final String TAG = BleGattCallback.class.getSimpleName();


private int connectionState = STATE_DISCONNECTED;

protected static final int STATE_DISCONNECTED = 0;
protected static final int STATE_CONNECTING = 1;
protected static final int STATE_CONNECTED = 2;

// public static final String ACTION_GATT_CONNECTED = "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status,
int newState) {
Logg.i(TAG, "onConnectionStateChange");
try {
super.onConnectionStateChange(gatt, status, newState);

if (newState == BluetoothProfile.STATE_CONNECTED) {
connectionState = STATE_CONNECTED;
Logg.w(TAG, "Connected to GATT server");
Logg.i(TAG, "Attempting to start service discovery:" + gatt.discoverServices());
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
connectionState = STATE_DISCONNECTED;
Logg.w(TAG, "Disconnected from GATT server.");
try {
gatt.close();
} catch (Exception e) {
Logg.d(TAG, "close ignoring: " + e);
}
}
}catch(NullPointerException e){
Logg.i(TAG, "NullPointerException onConnectionStateChange");
}
}
}

我在尝试断开连接时在 stackoverflow 中看到了类似的错误,解决方案是在 gatt.disconnect 之后不立即调用 gatt.close(),但这是一个不同的问题,我无法解决它。我是使用蓝牙 LE 进行编程的新手,并且陷入了这一部分。

最佳答案

我刚刚发现了问题。这是一件愚蠢的事情,我用空的 bluetoothGattCallback 调用 device.connect 。写下这个问题确实对我很有帮助,我在这个问题上度过了一个洞。

关于java - 尝试连接 BluetoothGatt 时回调中出现未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40632855/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com