2015-12-03 198 views
4

我正在使用android BLE(藍牙低功耗)。我在使用
startLeScan(UUID[] serviceUuids, BluetoothAdapter.LeScanCallback callback)方法
掃描BLE設備時遇到問題,而startLeScan(BluetoothAdapter.LeScanCallback callback)工作正常。
當我使用過濾器掃描特定的serviceUUID時,回調沒有執行。我正在測試三星Galaxy s6。
我想知道這個問題是否是特定於設備的,或者在掃描功能中存在一些錯誤。Android BLE設備掃描過濾器不工作

+0

銀河S6具有5.0 + OS,因此您需要使用ScanResult Listener ,,, startLeScan已棄用。請檢查文檔 – IshRoid

+0

BluetoothLeScanner的問題。startScan(列表過濾器,ScanSettings設置,ScanCallback回調)'方法 – Alex

+0

那麼你應該發佈的代碼,,,因爲該方法應該工作,在你的代碼的問題,,, – IshRoid

回答

5

我很確定它不是特定於設備的。 首先,因爲IshArt提到你應該從Android 5.0開始使用startScan。

startScan(List<ScanFilter> filters, ScanSettings settings, ScanCallback callback) 

從我的經驗Scanfilters的實施,如果你去的MAC地址,而其他過濾器的設置參數是有問題的正常工作:

ScanFilter filter = new ScanFilter.Builder().setDeviceAddress(deviceMacAddress).build(); 
filters.add(filter); 

如果這不是一個選擇,你還可以實現你自己的過濾器。如果您將startScan()的過濾器列表保留爲空,它將忽略所有過濾並接收所有內容。然後在回調中,您可以編寫自己的方法來檢查結果是否符合您的要求。

+0

+1上的setDeviceAddress工作,但如果您使用單獨的過濾器並單獨添加,如我的答案的更新中所示,服務過濾器也可以工作。 如果您爲每個ScanFilter添加多個條件,它絕對是設備特定的。如果我在一次掃描中同時添加服務和mac地址條件,Galaxy S6完全不起作用。它適用於兩種掃描過濾器,每種條件都適用。 –

0

有2掃描方法:

//Device scan callback Lollipop and above 
    private ScanCallback generateScanCallback(){ 

     if(apiVersion> Build.VERSION_CODES.KITKAT) { 
      ScanCallback mScanCallback = new ScanCallback() { 
       @Override 
       public void onScanResult(int callbackType, ScanResult result) { 
        super.onScanResult(callbackType, result); 
        final BluetoothDevice device = result.getDevice(); 
        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Log.e(TAG, "running scan " + device.getAddress()); 
          if (device.getAddress().equals(mDeviceAddress)) { 
           Log.e(TAG, "device founded, trying to connect"); 
           scanLeDevice(false); 
           Intent gattServiceIntent = new Intent(mContext, BluetoothLeService.class); 
           mContext.bindService(gattServiceIntent, mServiceConnection, mContext.BIND_AUTO_CREATE); 
           mIndicationText.setText(mContext.getString(R.string.waiting)); 
          } 
         } 
        }); 
       } 
      }; 
      return mScanCallback; 
     } 
     return null; 
    } 


// Device scan callback KITKAT and below. 
private BluetoothAdapter.LeScanCallback mLeScanCallback = 
    new BluetoothAdapter.LeScanCallback() { 

     @Override 
     public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
      getActivity().runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Log.e(TAG,"running scan "+device.getType()); 
        if(device.getAddress().equals(mDeviceAddress)){ 
         Log.e(TAG, "device founded, trying to connect"); 
         scanLeDevice(false); 
         Intent gattServiceIntent = new Intent(mContext, BluetoothLeService.class); 
         mContext.bindService(gattServiceIntent, mServiceConnection, mContext.BIND_AUTO_CREATE); 
         mIndicationText.setText(mContext.getString(R.string.waiting)); 
        } 
       } 
      }); 
     } 
    }; 

比:

if(apiVersion> Build.VERSION_CODES.KITKAT) { 
    scanner = mBluetoothAdapter.getBluetoothLeScanner(); 
    // Device scan callback LOLLIPOP 
    scanner.startScan(generateScanCallback()); 
} else { 
    mBluetoothAdapter.startLeScan(mLeScanCallback); 
} 

您可以自定義掃描方法,只要你想,但你必須知道,有2個掃描方法之一android 5及以上一個用於其他androidOS

1

這是我用三星Galaxy S6發現的一個特定問題。我使用較新的掃描儀API,僅支持Android 5.0+以上的設備。我的測試顯示S4(未測試S5),S7和S8均可正常工作;我不知道爲什麼S6有問題。

解決方法是,可悲的是,只能在設備找到後手動過濾MAC地址。

更新

這個固定上面我與銀河S6有我的問題。

以前,我被添加兩個條件相同ScanFilter像這樣(科特林):

ScanFilter.Builder() 
    .setServiceUuid(BluetoothBlind.Service.ParcelUUID) 
    .setDeviceAddress(macAddress) 
    .build() 

改變它的條件分割成多個過濾器修復它:

ScanFilter.Builder() 
    .setDeviceAddress(macAddress) 
    .build() 

ScanFilter.Builder() 
    .setServiceUuid(BluetoothBlind.Service.ParcelUUID) 
    .build() 
+1

可以確認我的S6在Android 7上無法正確過濾服務UUID。別無選擇,只能在所有設備上手動過濾。 – Kevin