Android 蓝牙4.0踩坑汇总

在Android 中蓝牙4.0开发有一定时间了,这个过程中由于公司对蓝牙的使用要求比较苛刻,即希望连接上千次都不希望影响之后的使用,这个目标想要适配到所有手机中还是有点艰难的,同时也在这里面踩坑踩的不要不要的,以下是在蓝牙开发中踩过的一部比较印象比较深刻的坑,希望对大家有所帮助。

对android 蓝牙刚接触的人建议看一 下这篇文章:https://race604.com/android-ble-in-action/


1.BluetoothGatt.disconnect() 之后不能要马上BluetoothGatt.close().建议在 BluetoothGattCallback中收到BluetoothGatt.STATE_DISCONNECTED时才BluetoothGatt.close()

理由:disconnect() 之后调用close()虽然大部分手机调用正常,但存在手机蓝牙连接实际没有断开!!!这个会造成蓝牙资源泄露的问题,甚至蓝牙假死。同时这个最好做一个超时机制来释放连接,避免存在BluetoothGattCallback没有回调的情况。(注:之前有遇到手机在极端情况下没有回调)


2.蓝牙api调用过程建议采用notify() 和 wait()

理由:蓝牙的api调用基本都是异步的,但整个过程都是按顺序来的(connect->discovertServices->write->read.....disconnect),尤其是Characteristic读写非常复杂的时候,一旦出错会让你非常奔溃,甚至会导致蓝牙假死问题!!!所以建议封装异步调用成为同步调用(即用notify和wait),来大幅度地减少出错的可能。


3.蓝牙 startScan 分了低版本(5.0之下)和高版本(5.0以上)的api,低版本中建议startLeScan不要传递uuid,高版本中建议不要用到onBatchScanResults的方式。

理由:存在少部分机型底层没有处理好,导致完全扫描不到任何数据。


4. Android 7.0 以上系统不要在短时间内调用多次 startScan

理由:Android 7.0系统限制在 30s内最多只能扫描5次,用完之后在30s内是扫不到任何蓝牙的。


5.BluetoothGatt.requestConnectionPriority() 方法慎用(建议做机型覆盖)

理由:该方法可以修改蓝牙的连接间隔,加快蓝牙的连接过程(connect 到 discoverServices),但是在比较旧的机型(类似华为)发现,在连续调用几次后,后面的蓝牙变得连接非常不稳定.


6.不要持续调用蓝牙扫描

理由:在部分机型持续一定时间扫描后会发现需要重启蓝牙才能恢复扫描,这个现象在魅族手机上有遇到过;很久之前遇到蓝牙进行重复的扫描,停止扫描两个操作,一定时间后在传说中的国民手机红米上会出现这个bug,而且还必须重启手机才能恢复蓝牙功能。


7.手机做为中心设备建立连接,但由外设断开蓝牙连接时容易导致外设一定时间内连接不上,所以建立最好不要由外设来进行断开连接。

理由:这个可能跟蓝牙的一个断开协议有关系,正常来讲中心设备只要收到外设的断开指令后还会回馈给外设一个“收到断开”的回复,外设收到断开回复流程才算完成。但假设中心设备没有回复时,外设会持续等待直到超时断开(一般是10s),意思就是从端设备需要至少10s后才能再次被连接上。(该情况在oppo手机上100%必现)

蓝牙断开连接的协议

8.采用BluetoothManager.getConnectedDevices(int profile)来检查当前蓝牙连接的情况

理由:可以用来检测蓝牙资源有没有释放干净,因为避免繁琐的异步通信中容易出差。不过此法返回的连接数为空时,也不代表蓝牙的连接完全释放干净。


9.在小米mix2手机上,黑屏模式,service处于后台,蓝牙也没有调用,持续几分钟后,想调用蓝牙startScan方法,但无法扫描蓝牙或者扫描报异常,并且会有此日志--》 BluetoothLeScanner: start scan is blocked。

解决方法:
方案一:设置-》电量和性能 -》省电忧化 -》应用智能省电-》选择应用-》无限制
方案二:android 8.0 出了新的startScan方法,还可用于近场拉活进程(传送门),api描述见下图:

startScan api

蓝牙广播踩到的坑

使用蓝牙广播可以用来做许多事情,市面上有类似Ibeacon的产品就是基于蓝牙广播类现的,但在android 中还是有很多坑的。

1.android 5.0 以上才支持广播这就算了,在5.0以上部分机器还不支持蓝牙广播,例如:亲儿子nexus 5,甚至华为有些到达7.0系统的手机还不支持。

2.存在缓在,许多手机会将上一次广播过的内容再次广播出来一下才广播正常内容

3.android 对比ios,普遍机型广播信号强度弱,广播间隔偏少

4.存在手机进行多次广播后,蓝牙会自动重启(oppo手机上有遇到此类问题)

5.手机端广播出来的蓝牙mac地址不是固定的,每广播一次,变化一次


6.AdvertiseSettings.Builder.setTimeout() 调用时注意!!!

理由:Oppo r11,三星 Galaxy On7 (android 7.0)等机型,调用BluetoothLeAdvertiser.startAdvertising() 偶尔返回 ADVERTISE_FAILED_ALREADY_STARTED,偿试多次返回ADVERTISE_FAILED_TOO_MANY_ADVERTISERS,这很明显存在蓝牙广播泄漏问题!!!!

解决方法:由于该现象只在7.0以上的机型出现,所以本人只针对7.0以上的机型做处理。去掉setTimeout()方法,改为用线程延时调用BluetoothLeAdvertiser.stopAdvertising()停止广播


以下是其它前辈的踩坑总结:

http://blog.csdn.net/qingtiantianqing/article/details/52459629?locationNum=13

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,409评论 25 707
  • 蓝牙 蓝牙的波段为2400-2483.5MHz(包括防护频带)。这是全球范围内无需取得执照(但定不是无管制的)的工...
    苏永茂阅读 6,103评论 0 11
  • 蓝牙 注:本文翻译自https://developer.android.com/guide/topics/conn...
    RxCode阅读 8,613评论 11 99
  • 那天早上我临走前还看见它对我眨着眼睛仿佛在说再见,然后在我关门的刹那,我看见它从窗子口跳了下去,我也没在意,我觉得...
    简唱阅读 394评论 0 0
  • 博主是个大V,粉丝挺多的,他的这一番言论引起了粉丝们激烈的辩论,一些人表示赞同也有一些人反对。我翻了翻评论,一个男...
    方觉夏阅读 618评论 9 10