Android 4.0 蓝牙连接遇到的奇怪问题
大家好,本人最近在开发一个App和硬件交互的项目,但是在开发过程中遇到了很奇怪很棘手的问题,拿出来和大家说一下。
在连接时有这么一个情况,我先打开app端的蓝牙搜索功能,然后在硬件关机状态下开机,app端设置扫描时间为30s,待app端扫描到硬件时,点击硬件建立连接,这时候底层会报一个133的错误,再去连接会一直报133的错误,退出app再去搜索连接依然还是133,但是重启系统蓝牙再去搜索连接好使。但是这个情况并不是在所有手机上都有,在三星Note4 手机上直接连上或者开始会报133,但是再去连接依然会连接上,非三星手机 华为荣耀 7i,P9,小米4c等就和上述描述的情况一样需要重启蓝牙才能再次连接上。
最开始报133这个问题,查阅网上资料都说是没有执行gatt的close()方法,gatt对象的数量超过Android系统最大数量导致,于是我在每次在重新连接前都执行disconnect()和close()方法,但是这样依然会出现上面的问题。这是说一下三星手机和非三星手机的重连方法,重连有两种一种是使用已有对象gatt.reconnect()方法,另一种是重新建立gatt对象,bluetoothDevice.connectGatt(this, false, mGattCallback)方法。对于三星手机我使用第一种和第二种方法都好使,所以就使用了第一种。对于非三星手机,经我测试和从网上查阅的资料看第一种方式连接成功的概率非常小,所以我使用第二种方式,相当于重新建立一次蓝牙连接。
对于133的问题打印的log日志如下:
D/BluetoothGatt: registerApp()
D/BluetoothGatt: registerApp() - UUID=ed47197c-722e-49de-a2b6-97b87579dd14
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=8
D/BluetoothLeClass: Trying to create a new connection.
D/BluetoothGatt: onClientConnectionState() - status=133 clientIf=8 device=BE:EF:BE:EF:BA:E9
I/BluetoothLeClass: Disconnected from GATT server.
对于这种重启蓝牙能重新建立连接的这种方法,我开始怀疑是否真的是在蓝牙建立连接过程中发生阻塞了,于是我又用反射调用了gatt对象的refresh()方法,在执行close()之前执行,但是并没什么用。 最后我再说下前提条件我们的硬件是没有问题的,ios端和电脑端蓝牙连接都是没有这个问题出现的。各位朋友,有什么想法或者建议衷心希望您提出来,小弟非常感谢!