调试蓝牙设备的时候,发现某些高版本的机器上出现java.lang.NoSuchFieldException: No field mDeviceBusy in class Landroid/bluetooth/BluetoothGatt; (declaration of 'android.bluetooth.BluetoothGatt' appears in /apex/com.android.btservices/javalib/framework-bluetooth.jar)异常,从而导致有时候蓝牙数据传输异常(关于BluetoothGatt mDeviceBusy的作用请自行百度 ),查看源码后发现:
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) 68 private Boolean mDeviceBusy = false;
该字段最大支持版本为
targetSdk=30
将build.gradle中的targetSdk改为30以下可以解决。
阅读源码发现writeCharacteristic和readCharacteristic都有下面这段,也可以通过writeCharacteristic和readCharacteristic的返回值类判断蓝牙信号是否下发成功。
synchronized (mDeviceBusyLock) { if (mDeviceBusy) return false; mDeviceBusy = true; }