Android 7.0 status=22错误

BLE开发,处处是坑啊~~~

最近在做一个BLE相关功能的封装,本来一切正常。可拿到客户那边就出问题了:BLE已经连接成功,但是又自动断开了连接…

好吧,客户既然有问题,那咱就解决呗~~

了解了客户的使用环境(Android 7.0,某*S7+)后,搭建相同的运行测试环境,开始调试。

调试过程中发现了如下的问题:
这里写图片描述

多次连接->断开的日志输出:
这里写图片描述

还真有这个问题:发生的错误码是"status=22"

但是我翻看了关于BluetoothGatt的错误码,没有这个22的错误码。。。(完全蒙蔽了。。)

查看Stack Overflow上,有同学针对这个22的错误码给出了一些说明:

这里写图片描述

是手机设备主动停止了连接?为什么会停止连接呢? 为什么在7.0以上的系统会主动停止连接,而6.0的就没有问题呢?是Android7.0以上对BLE有什么修改么?

Stack Overflow上的这位同学并没有给出发生这个错误码的原因以及解决方法,没办法,还是要自己解决了。。。

于是翻看Android7.0的更新内容,然鹅并没有对BLE的更新内容有任何说明。

网上对于这个问题没有任何解决方法(难道是大佬都没有遇到过这个错误码?)
于是我只能使用其他乱七八糟的方法:发生此异常码错误时,主动断开连接,或者重连等方法来规避这一错误,但是效果收效甚微:由于牵扯到其他的操作,所以还要对其他的逻辑进行修改,时不时就会发生意想不到的错误,风险很高。

正在我焦头烂额的到处修改异常时,突然发现了BLE创建连接时的方法:

/**
     * Connect to GATT Server hosted by this device. Caller acts as GATT client.
     * The callback is used to deliver results to Caller, such as connection status as well
     * as any further GATT client operations.
     * The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct
     * GATT client operations.
     * @param callback GATT callback handler that will receive asynchronous callbacks.
     * @param autoConnect Whether to directly connect to the remote device (false)
     *                    or to automatically connect as soon as the remote
     *                    device becomes available (true).
     * @throws IllegalArgumentException if callback is null
     */
    public BluetoothGatt connectGatt(Context context, boolean autoConnect,
                                     BluetoothGattCallback callback) {
        return (connectGatt(context, autoConnect,callback, TRANSPORT_AUTO));
    }

上面这个方法给我们提供了连接设备BLE的接口,其中第二个参数autoConnect,给出的解释是:“直接连接设备(false),或者等待设备可用的时候自动连接(true)”。

抱着试试看的想法,我将第二个参数autoConnect修改为true,重新打包运行在Android7.0的设备上,奇迹竟然发生了!!!

多次手动连接->断开操作,依然没有发生这个22的错误码

这里写图片描述

然后在Android6.0的设备上测试,也没有问题。。。

但是。。完全不知道什么原因导致的。也不是很理解这个autoConnect的重连机制是怎样的,我测试了手动断开连接,或者距离超出后自动断开连接,都没有发生所谓的autoConnect重连事件。。

所以。。。。目前这个问题暂时这样解决吧,等以后有机会,或者有能力了,在详细了解一下这个autoConnect机制,以及这个status=22的错误码。

最后,附上修改的方法:(对7.0以上的设备连接,单独使用autoConnect=true的连接方法)

// Android7.0以上的,需要将autoConnect置为true,否则会在回调中收到status=22的错误码(目前不知道原因)
mBluetoothGatt = device.connectGatt(this, Build.VERSION.SDK_INT >= 24, mGattCallback);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值