4

Я работаю с android BLE (Bluetooth Low Energy). У меня возникают проблемы при сканировании устройства BLE с использованием метода
startLeScan(UUID[] serviceUuids, BluetoothAdapter.LeScanCallback callback)
, а startLeScan(BluetoothAdapter.LeScanCallback callback) работает нормально.
Когда я использую фильтр для сканирования определенных идентификаторов serviceUUID, обратный вызов не выполняется. Я тестирую галактику s6 ssung.
Я хочу знать, является ли эта проблема специфичной для устройства или есть некоторая ошибка в функции сканирования.Сканирование устройства Android BLE с фильтром не работает

+0

Galaxy s6 имеет 5.0 + OS, поэтому вам нужно использовать ScanResult Listener ,,, startLeScan устарел. Проверьте Documentaion – IshRoid

+0

та же проблема с 'BluetoothLeScanner.startScan (список фильтров, настройки ScanSettings, обратный вызов ScanCallback) 'method – Alex

+0

, тогда вы должны опубликовать код ,,, потому что метод должен работать, проблема с вашим кодом ,,, – IshRoid

ответ

5

Я уверен, что это не устройство. Прежде всего, как упоминалось в IshArt, вы должны использовать startScan с Android 5.0.

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. Galaxy S6 не работает вообще, если я добавлю оба условия обслуживания и адреса mac к одному сканированию. Он хорошо работает с двумя ScanFilters с каждым условием. –

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

Это конкретная проблема, которую я нашел с Samsung Galaxy S6. Я использую новый API-интерфейс сканера и поддерживаю только устройства на Android 5.0+. Мое тестирование показало, что S4, (не тестировали S5), S7 и S8 все работают; Я не знаю, почему у S6 есть проблемы.

Обходное решение, к сожалению, просто отфильтровывать вручную по адресу mac после того, как устройства найдены.

Update

Это фиксированное мои вопросы выше, что у меня было с Galaxy 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 не смог правильно фильтровать Service UUID. Теперь нет выбора, кроме как фильтровать вручную все устройства. – Kevin

Смежные вопросы