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

  • 相关阅读:
    《android开发艺术探索》读书笔记(八)--WindowManager
    《android开发艺术探索》读书笔记(七)--动画
    《android开发艺术探索》读书笔记(六)--Drawable
    《android开发艺术探索》读书笔记(五)--RemoteViews
    PendingIntent
    桌面小部件开发
    《android开发艺术探索》读书笔记(四)--View工作原理
    Quartz.NET开源作业调度框架系列
    多线程下C#如何保证线程安全?
    图解.NET Stack和Heap的本质区别
  • 原文地址:https://www.cnblogs.com/PHBlog/p/11417385.html
Copyright © 2020-2023  润新知