BLE无法正常回调onServicesDiscovered方法解决方法
笔者最近在做一个蓝牙服务,无法正常回调onServicesDiscovered让我忙上忙下瞎调试了一天。网上查到了一些相关博客,写的很对!有用!这里就调试方法做一个小小的总结,也有一个笔者新改动的地方写下来避免后来者入坑。
1.调用gatt.discoverService需要写在onConnectionStateChange方法里面。
2.延时多调用几次discoverService方法。多调用本质上其实就包括了延时,而笔者之所以在多调用的基础上再加上延时,是因为避免出现多次进入onServisesDiscovered方法,虽然我也不知道多进入几次有什么不好,hhh。延时的做法很简单,在gatt.discoverService前加上一句Thread.sleep(1000),代表休眠1000ms后继续执行,休眠语句需要做try catch操作。多调用几次discoverService方法需要申明一个全局变量boolean temp,然后将discoverService放到if(!temp)当中。temp默认为false,在onServicesDiscovered中让temp=true,这样就能确保进入到了onServicesDiscovered回调。代码如下:
1 public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 2 String intentAction; 3 if (newState == BluetoothProfile.STATE_CONNECTED) { 4 intentAction = ACTION_GATT_CONNECTED; 5 mConnectionState = STATE_CONNECTED; 6 broadcastUpdate(intentAction); 7 //discoverService 8 while(!gotoServiceDiscover) {//gotoServiceDiscover为定义的全局变量,初始值为false,true代表回调了onServicesDiscovered方法 9 Log.d(TAG,"next time failed"); 10 try{ 11 Thread.sleep(2000); 12 }catch (Exception e){ 13 e.printStackTrace(); 14 } 15 if(!gotoServiceDiscover){ 16 flag = mBluetoothGatt.discoverServices(); 17 } 18 } 19 }
}
3.笔者所做的是一个开机自启动的蓝牙服务。在收到开机广播后,startService。经常出现这样的情况,在实例化BluetoothManager和BluetoothAdapter后,调用BluetoothAdapter的getRemoteDevices方法,此时可能蓝牙还没能自动连接,所以就出问题了。于是笔者在BootBroadcastReceiver中在收到开机广播后,延时20s再启动相应服务,这样蓝牙正常连接,也能正常进入onServicesDiscovered回调了。事实上,这样的判定条件还是不准确,改为获得蓝牙设备成功连接标志后再启动相应服务会更好一些。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】博客园2025新款「AI繁忙」系列T恤上架,前往周边小店选购
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步