Ionic Native BLE无回调问题求助(Ionic 3 Android 7.0环境)
兄弟,太懂你折腾一个月的崩溃感了——BLE这种东西有时候就是藏着各种玄学坑,既然File功能正常,说明Ionic Native的基础机制没问题,咱们就从BLE特有的细节一步步抠:
先把权限配置拉满,别漏了运行时权限
Android 6.0+扫BLE设备不仅要蓝牙权限,还得要位置权限,而且必须是运行时主动申请,光在AndroidManifest.xml里加配置没用:- 先确认
AndroidManifest.xml里的权限:<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> - 代码里主动请求位置权限(用
cordova-plugin-android-permissions):import { AndroidPermissions } from '@ionic-native/android-permissions'; // 初始化BLE前先做权限检查 this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION) .then(result => { if (!result.hasPermission) { this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION); } });
很多人栽在这一步——权限没到位的话,扫描根本触发不了,自然没任何回调。
- 先确认
核对BLE插件版本,别用太新的
Ionic 3对Ionic Native插件的版本很挑剔,新版本的@ionic-native/ble(比如5.x+)只适配Ionic 4+,你得用4.x.x系列的版本(比如4.20.0),兼容性最好。可以看看package.json里的版本,不对的话重新装:ionic cordova plugin remove cordova-plugin-ble-central npm uninstall @ionic-native/ble npm install @ionic-native/ble@4.20.0 ionic cordova plugin add cordova-plugin-ble-central写极简测试代码,排除业务逻辑干扰
别用复杂的示例,先写最基础的扫描代码测试,甚至用alert确保能看到反馈(避免console被忽略):import { BLE } from '@ionic-native/ble'; constructor(private ble: BLE) {} testBleScan() { console.log('开始扫描BLE设备'); this.ble.startScan([]).subscribe( device => { console.log('找到设备:', device); alert('终于扫到设备了!'); }, error => { console.error('扫描出错:', error); alert('扫描错误:' + error); } ); // 3秒后自动停止扫描 setTimeout(() => { this.ble.stopScan().then(() => console.log('停止扫描')); }, 3000); }页面加个按钮调用
testBleScan(),看看有没有弹窗。如果还是没反应,大概率是插件安装出问题了,试试清空平台再重建:ionic cordova platform remove android ionic cordova platform add android@7.1.4 # 对应Ionic 3的Android平台版本检查设备的BLE细节,别忽略硬件/系统设置
虽然你开了蓝牙,但可以用代码确认状态:this.ble.isEnabled().then( () => console.log('蓝牙已正常开启'), () => { console.log('蓝牙未开,请求开启'); this.ble.enable(); } );另外,有些Android 7.0设备的位置服务虽然开了,但没设为“高精度模式”,也会导致BLE扫描失效,可以手动去系统设置里调整试试;条件允许的话换另一台Android 7.0真机测试,排除硬件BUG。
扒原生日志,找底层原因
如果上面都试过还是不行,就得看Android原生日志了,用adb命令过滤BLE相关日志:adb logcat | grep -i ble这里会输出原生层的所有BLE相关信息,比如权限被拒、扫描失败的具体原因,往往能揪出那些表面看不到的坑。
内容的提问来源于stack exchange,提问作者zeh

