Android BLE开发中踩过的坑

作者: fengmlo | 来源:发表于2016-09-05 16:23 被阅读3371次

    Android在4.3中引入了对BLE的支持,BLE基本使用方法请参考Android BLE开发入门

    以下是我在BLE开发中遇到的坑:

    • 数据长度
      BLE的特征一次读写最大长度20字节

    • 异步问题
      读写Characteristic、Descriptor等几乎所有BLE操作结果都为异步返回,若不等待上一次操作结果返回就执行下一次操作,很可能导致操作失败或者操作无效。onDescriptorWrite()返回的线程与写入线程为同一个线程,别的操作一般在不同的线程回调。

    • 设备缓存
      Android会对连接过的BLE设备的Services进行缓存,若设备升级后Services等有改动,则程序会出现通讯失败。此时就得刷新缓存,但是刷新缓存的方法并没有开放,这里只能使用反射来调用BluetoothGatt类中的refresh()方法:

    try {
        Method localMethod = mBluetoothGatt.getClass().getMethod("refresh");
        if (localMethod != null) {
            return (Boolean) localMethod.invoke(mBluetoothGatt);
        }
    } catch (Exception localException) {
        Log.e("refreshServices()", "An exception occured while refreshing device");
    }
    
    • 扫描设备
      startLeScan(UUID[], BluetoothAdapter.LeScanCallback)在Android4.4及以下手机中似乎只支持16位的短UUID,不支持128位完整的UUID。

    • 蓝牙回调
      安卓4.4的蓝牙回调是在异步线程中(不在主线程),若要在蓝牙回调中执行更新界面的操作,记得切换到主线程去操作

    • 三星手机兼容性问题
      connectGatt()方法在某些三星手机上只能在UI线程调用。

    • Android L 新API
      Android L换了一套扫描设备的API:BluetoothLeScanner.startScan(List, ScanSettings, ScanCallback)

    • Android M新的权限
      Android M中必须拥有定位权限才能扫描BLE设备

    • 连接不断开的问题
      别的BLE程序非法保留连接的设备可能会导致连接不能断开

    相关文章

      网友评论

      • 追梦的小蜗牛:小米手机,在断开的回调方法中调用扫描,可以扫描到设备,但有时候会出现连接不上的问题
        18e9e8279e0b:disconnect 之后必须使用 close 来回收蓝牙gatt资源,否则会造成资源占用问题
      • 快乐的橙橙宝:connectGatt()方法在某些三星手机上只能在UI线程调用。请问下这个是BluetoothDevice的connectGatt()方法吗
        fengmlo:@月夜漂泊 很高兴能帮到你
        快乐的橙橙宝:@fengmlo 我周五也碰到这个问题了,问题处理了,三星的手机是connet和disconnet还有connectGatt都要在UI线程中操作,stackoverflow上面查到了相同的问题,感谢。
        fengmlo:是的,之前测试的时候发现有两台三星有这个问题,所以做了记录

      本文标题:Android BLE开发中踩过的坑

      本文链接:https://www.haomeiwen.com/subject/eqvrettx.html