Android 4.0 蓝牙连接遇到的奇怪问题

代码在青春飞扬 2016-08-03 11:15:59
大家好,本人最近在开发一个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端和电脑端蓝牙连接都是没有这个问题出现的。各位朋友,有什么想法或者建议衷心希望您提出来,小弟非常感谢!
...全文
4891 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
萌萌的晨子 2018-04-08
  • 打赏
  • 举报
回复
希望楼主能够大概讲一下可能是硬件哪里的问题.我现在遇到了和楼主几乎一模一样的情况...
墨子一笑5 2017-09-08
  • 打赏
  • 举报
回复
请问,你有没有测试 Honor 8 EMUI5.0 Android7.0、魅族E2,是不是不支持BLE啊
甄可爱 2017-05-16
  • 打赏
  • 举报
回复
引用 5 楼 dxc1228 的回复:
[quote=引用 3 楼 tszhao123cool 的回复:] 楼主,您好 我们也是这个现象,你解决了吗 我的邮箱 tszhao123cool@163.com 如有回应,不胜感激!!!
你好,我现在还是没有研究出来,你最近有什么进展么?[/quote] 我最近也遇到这个问题了,请问你们有谁有这一方面的问题的进展吗?
甄可爱 2017-05-16
  • 打赏
  • 举报
回复
引用 14 楼 dxc1228 的回复:
这个问题前段时间终于解决了,是我们硬件系统中用的博通蓝牙库的bug,然后和嵌入式工程师一起抓日志,分析日志,最终解决了这个问题,然后连接就非常顺畅了,算是涨个经验吧,出问题了不要一味只找自己方面的问题,和硬件端工程师的也聊聊,苹果手机和部分安卓手机的蓝牙机制不一样,不能拿苹果去比。
能详细说一下你最后得到的问题原因吗?
Ljiqinsiyuan1 2017-05-09
  • 打赏
  • 举报
回复
连接之前 先 清缓存, 再 断开连接 和 close() 一下,再试试。清蓝牙缓存连接: http://blog.csdn.net/zzfenglin/article/details/51105893#
Ljiqinsiyuan1 2017-05-09
  • 打赏
  • 举报
回复
连接之前 先 清缓存, 再 断开连接 和 close() 一下,再试试。
小菜陈 2017-04-27
  • 打赏
  • 举报
回复
引用 14 楼 dxc1228 的回复:
这个问题前段时间终于解决了,是我们硬件系统中用的博通蓝牙库的bug,然后和嵌入式工程师一起抓日志,分析日志,最终解决了这个问题,然后连接就非常顺畅了,算是涨个经验吧,出问题了不要一味只找自己方面的问题,和硬件端工程师的也聊聊,苹果手机和部分安卓手机的蓝牙机制不一样,不能拿苹果去比。
同问,你那边硬件大概是什么问题,我现在也遇到有时断开再扫描不到设备的问题,主要是当发起连接后会卡在mService.clientConnect这一步(源码里面注册后发起连接的一步),这时如果用户退出控制即发起disconnect和close,感觉没效果,无法完全断开,再隔断时间扫描时就会找不到这个设备了,或者连接时无法成功,只有重启蓝牙才行,我猜测主要还是信号不稳定的问题,所以问一下,你那边硬件驱动大概问题在哪,有什么解决方法
wumou0523 2017-04-26
  • 打赏
  • 举报
回复
引用 15 楼 jiang_gta 的回复:
楼主有遇到ble蓝牙连接成功后,一会自动断开的情况吗?在华为手机上表现的很 明显
我也有遇到这情况,魅族的也很严重,甚是蛋疼
qq_34645464 2017-04-24
  • 打赏
  • 举报
回复
引用 9 楼 dxc1228 的回复:
[quote=引用 8 楼 u010908808 的回复:] 虽然我不知道原理,但是有几个操作可以让这种情况出现地少一点: 1.尽量不要在startLeScan的时候尝试连接,先stopLeScan后再去连 2.对同一设备断开后再次连接,哪怕调用完close,需要等待一段时间(400毫秒试了1次,结果不行;1000毫秒则再没出现过问题)后再去connectGatt 3.在gatt连接没断开前,是搜索不出该设备的 4.如果嫌关闭又打开蓝牙麻烦,可以在连接前startLeScan一下,成功率要高一点
谢谢你的回答,这几个操作确实能够减少133的情况,我现在最头疼的一点就是非三星手机(华为,小米)一旦出现133基本就废了,再也连不上了,除非重启蓝牙,不知道你有什么好的主意?[/quote] 我手上的699的华为手机就是这样,这个问题怎么解决的?qq :2418184171,希望能够得倒回复。
jiang_gta 2017-04-20
  • 打赏
  • 举报
回复
楼主有遇到ble蓝牙连接成功后,一会自动断开的情况吗?在华为手机上表现的很 明显
  • 打赏
  • 举报
回复
这个问题前段时间终于解决了,是我们硬件系统中用的博通蓝牙库的bug,然后和嵌入式工程师一起抓日志,分析日志,最终解决了这个问题,然后连接就非常顺畅了,算是涨个经验吧,出问题了不要一味只找自己方面的问题,和硬件端工程师的也聊聊,苹果手机和部分安卓手机的蓝牙机制不一样,不能拿苹果去比。
  • 打赏
  • 举报
回复
引用 10 楼 htyxz8802 的回复:
在每次close前,先将BluetoothGatt refresh一下,应该就可以了,这里的refresh只有通过反射的方式去执行,直接上代码: /** * 清理本地的BluetoothGatt 的缓存,以保证在蓝牙连接设备的时候,设备的服务、特征是最新的 * @param gatt * @return */ public boolean refreshDeviceCache(BluetoothGatt gatt) { if(null != gatt){ try { BluetoothGatt localBluetoothGatt = gatt; Method localMethod = localBluetoothGatt.getClass().getMethod( "refresh", new Class[0]); if (localMethod != null) { boolean bool = ((Boolean) localMethod.invoke( localBluetoothGatt, new Object[0])).booleanValue(); return bool; } } catch (Exception localException) { localException.printStackTrace(); } } return false; }
谢谢回答,这个refresh()我试了,不好使!
zxc87788091 2016-10-31
  • 打赏
  • 举报
回复
请问楼主解决了吗?能提供下解决方法?
幻影宇寰 2016-10-29
  • 打赏
  • 举报
回复
我这里有个BLE的基础操作库,已经过实际项目验证,并没有出现过类似情况,你可以使用该库再试试是否会出现这种情况。 项目介绍:http://blog.csdn.net/xiaoyaoyou1212/article/details/52346904 项目地址:https://github.com/xiaoyaoyou1212/BLE
htyxz8802 2016-10-27
  • 打赏
  • 举报
回复
在每次close前,先将BluetoothGatt refresh一下,应该就可以了,这里的refresh只有通过反射的方式去执行,直接上代码: /** * 清理本地的BluetoothGatt 的缓存,以保证在蓝牙连接设备的时候,设备的服务、特征是最新的 * @param gatt * @return */ public boolean refreshDeviceCache(BluetoothGatt gatt) { if(null != gatt){ try { BluetoothGatt localBluetoothGatt = gatt; Method localMethod = localBluetoothGatt.getClass().getMethod( "refresh", new Class[0]); if (localMethod != null) { boolean bool = ((Boolean) localMethod.invoke( localBluetoothGatt, new Object[0])).booleanValue(); return bool; } } catch (Exception localException) { localException.printStackTrace(); } } return false; }
  • 打赏
  • 举报
回复
引用 8 楼 u010908808 的回复:
虽然我不知道原理,但是有几个操作可以让这种情况出现地少一点: 1.尽量不要在startLeScan的时候尝试连接,先stopLeScan后再去连 2.对同一设备断开后再次连接,哪怕调用完close,需要等待一段时间(400毫秒试了1次,结果不行;1000毫秒则再没出现过问题)后再去connectGatt 3.在gatt连接没断开前,是搜索不出该设备的 4.如果嫌关闭又打开蓝牙麻烦,可以在连接前startLeScan一下,成功率要高一点
谢谢你的回答,这几个操作确实能够减少133的情况,我现在最头疼的一点就是非三星手机(华为,小米)一旦出现133基本就废了,再也连不上了,除非重启蓝牙,不知道你有什么好的主意?
心在D血 2016-08-24
  • 打赏
  • 举报
回复
虽然我不知道原理,但是有几个操作可以让这种情况出现地少一点:
1.尽量不要在startLeScan的时候尝试连接,先stopLeScan后再去连
2.对同一设备断开后再次连接,哪怕调用完close,需要等待一段时间(400毫秒试了1次,结果不行;1000毫秒则再没出现过问题)后再去connectGatt
3.在gatt连接没断开前,是搜索不出该设备的
4.如果嫌关闭又打开蓝牙麻烦,可以在连接前startLeScan一下,成功率要高一点
  • 打赏
  • 举报
回复
引用 6 楼 Emily_cyy的回复:
我也是。。。。133这个问题好头疼。你们有遇到过android app多次操作ble设备后,设备搜索不到的情况吗
这个好像是遇到过,但是不是经常有
Emily_cyy 2016-08-19
  • 打赏
  • 举报
回复
我也是。。。。133这个问题好头疼。你们有遇到过android app多次操作ble设备后,设备搜索不到的情况吗
  • 打赏
  • 举报
回复
引用 3 楼 tszhao123cool 的回复:
楼主,您好 我们也是这个现象,你解决了吗 我的邮箱 tszhao123cool@163.com 如有回应,不胜感激!!!
你好,我现在还是没有研究出来,你最近有什么进展么?
加载更多回复(4)

80,360

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧