1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android BLE低功耗蓝牙重启手机后自动连接失败问题

Android BLE低功耗蓝牙重启手机后自动连接失败问题

时间:2021-05-16 01:26:56

相关推荐

Android BLE低功耗蓝牙重启手机后自动连接失败问题

最近在做安卓开发,用到蓝牙模块相关功能。主要功能是使用手机连上低功耗蓝牙设备,比如蓝牙手环。关于如何蓝牙连接在这里就不讲述了,网上搜索一大堆相关教程。想要来这里看蓝牙连接方式的朋友可能要大失所望了。

连接蓝牙成功后,因为蓝牙连手环一直是处于长连的状态。所以我在APP重启的时候做了一个自动重连的功能。主要就是在扫描结果的方法中去检测上一次连接的蓝牙设备地址,匹配上之后自动调用connectGatt()方法进行重连。

其中address是上次APP关闭前连接的蓝牙设备地址。在这里我是保存到了sharepreference当中,然后在onCreate()的时候重新拿出来.接着直接调用BluetoothAdapter.getRemoteDevice()获取一个device实例去连接。

注:不用在意那些红线,只是警告,版本问题

这么做其实没有问题,重启APP后也能很快的连接上。

然而,奇葩的问题来了,在重启手机后,在重新打开APP,就connectGatt()连接失败了。由于我设置的是连接失败后就不断循环去重连,而connectGatt()连接失败的话会有一个很长的响应超时时间,大概在30S左右才能进入回调方法BluetoothGattCallback()当中。而且提示

onClientConnectionState() - status=133 clientIf=5 device=F2:XX:XX:XX:XX:XX

看到133错误,首先是各种百度、论坛、博客找,好多大牛都说是因为上次蓝牙连接没有close()释放资源的原因。然而我根据大牛们的建议去尝试修改,然而并没什么卵用。

素质疑问三连:为什么重启APP不会出现问题,而重启手机再打开APP就回出现问题呢?APP重启了资源不是也跟着释放了吗?APP重启和手机重启的区别在哪里呢?

百度无果,只能去看看源码了。我去研究了connectGatt()方法,然而却发现我的问题定位错了。其实并不是connectGatt()方法的问题。最后我发现是这个mBluetoothAdapter.getRemoteDevice(address)的问题,getRemoteDevice()方法虽然能得到一个device实例,但是如果你直接用他来connectGatt(),那么久GG了。因为手机重启后,BluetoothAdapter也重新做了初始化,在没有重新扫描的情况下,直接去使用getRemoteDevice(adress)去获取device进行connectGatt(),是不会匹配上的。

问题就在于想要自动重连上,首先需要先进行一次扫描蓝牙设备。所以我在扫描蓝牙设备结果里面做了修改。

当扫描到address相同的设备时,我再主动进行重连,如此一来,问题就解决了。

总结:假如要使用蓝牙自动重连,必须考虑手机重启的情况。BluetoothAdapter是系统变量,重启手机的时候可能会把扫描的设备信息清理掉。这就会导致connectGatt()连接失败。最好的方法是重启APP后先手动扫描一次,在进行重连。

这问题难了我两天时间,头晕。网上也没有找到相关问题的解决办法,在此记录一下。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。