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回調了。事實上,這樣的判定條件還是不准確,改為獲得藍牙設備成功連接標志后再啟動相應服務會更好一些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM