zoukankan      html  css  js  c++  java
  • 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回调了。事实上,这样的判定条件还是不准确,改为获得蓝牙设备成功连接标志后再启动相应服务会更好一些。

  • 相关阅读:
    linux c dlopen加载动态链接库
    c++锁 测试 (gcc test.cpp -o test -lpthread)
    shell 清理目录下 超过一段时间的数据。
    大话存储学习笔记
    python总结
    正则表达式使用
    #linux shell#模拟日志生成过程
    深入理解Java虚拟机
    Nginx修改access.log日志时间格式
    mfcs100d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined
  • 原文地址:https://www.cnblogs.com/PHBlog/p/11417385.html
Copyright © 2011-2022 走看看