游客发表
androidBluetoothKit对接这事,说穿了就是三步:扫描、配对、通信。但每一步都有坑,我踩过,所以直接说干货。
先看扫描。别用传统BluetoothAdapter.startDiscovery(),那玩意在Android 6.0以后权限卡得死死的,运行时你得同时申请定位权限和蓝牙权限,用户一拒绝就白搭。用BluetoothLeScanner吧,但注意——它只扫BLE设备。要是你对接的是经典蓝牙(比如老式蓝牙串口模块),还得走旧API。我项目里那台工业扫码枪就是经典蓝牙,折腾半天才明白过来,代码里得同时兼容两套扫描逻辑,不然设备列表永远空着。
配对环节更恶心。系统弹窗授权是异步的,你没法直接拿结果。网上教程都让你注册BroadcastReceiver监听ACTION_BOND_STATE_CHANGED,但没人告诉你——有些国产ROM(小米、华为)会把这个广播给阉割了。我实机测试时,小米手机配对成功但广播死活不触发,最后只能加个超时轮询,每500毫秒查一次bondState。丑是丑了点,但管用。
通信才是重头戏。BLE用GATT,你得写一堆回调,onConnectionStateChange、onServicesDiscovered、onCharacteristicRead……嵌套得跟千层饼似的。我后来用RxAndroidBle这个库,链式调用舒服多了,但注意它底层还是同一套东西,只是封装了线程切换。要是你对接的是经典蓝牙Socket,记得开子线程读写,别在主线程搞——我一开始没注意,直接ANR,界面卡死三秒,用户早把App杀了。
还有个细节:MTU。BLE默认MTU只有23字节,你发个长数据得自己拆包。我第一次传一张图片,没设MTU,数据被截成碎渣,接收端拼都拼不回来。后来调用requestMtu(512),再自己写分包逻辑,才搞定。这个坑,文档里写得含糊,不实测根本想不到。
最后说个玄学问题——信号干扰。同一间办公室,华为手机连得上,三星连不上;站在窗边稳定,坐在角落掉线。蓝牙这玩意对环境太敏感,你代码写得再好,射频上出问题也白搭。我最后给测试机专门买了个USB蓝牙适配器,插电脑上模拟真机环境,才把问题定位到是手机天线问题还是代码问题。
对接到最后你会发现,androidBluetoothKit本身不难,难的是Android碎片化带来的各种意外。别指望一套代码跑遍所有机型,做好日志,随时准备针对特定设备加补丁。这活计,耐心比技术重要。
友情链接