Я работаю с android BLE (Bluetooth Low Energy). У меня возникают проблемы при сканировании устройства BLE с использованием метода startLeScan(UUID[] serviceUuids, BluetoothAdapter.LeScanCallback callback)
, а startLeScan(BluetoothAdapter.LeScanCallback callback)
работает нормально.
Когда я использую фильтр для сканирования определенных идентификаторов serviceUUID, обратный вызов не выполняется. Я тестирую галактику s6 ssung.
Я хочу знать, является ли эта проблема специфичной для устройства или есть некоторая ошибка в функции сканирования.Сканирование устройства Android BLE с фильтром не работает
ответ
Я уверен, что это не устройство. Прежде всего, как упоминалось в 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() пустым, он игнорирует всю фильтрацию и получает все. Затем в обратном вызове вы можете написать свой собственный метод, чтобы проверить, соответствует ли результат вашим требованиям или нет.
+1 на setDeviceAddress работает, но фильтр службы может работать, если вы используете отдельный фильтр и добавляете его отдельно, как показано в обновлении моего ответа. Это определенно специфично для устройства, если вы добавляете несколько условий для ScanFilter. Galaxy S6 не работает вообще, если я добавлю оба условия обслуживания и адреса mac к одному сканированию. Он хорошо работает с двумя ScanFilters с каждым условием. –
есть метод 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
и выше, и один для другого android
OS
Проблема с проверкой фильтров BLE является известной проблемой. См. https://github.com/iDevicesInc/SweetBlue/wiki/Android-BLE-Issues для этой и других проблем BLE. Вывод прост: «Вы должны сканировать все устройства и фильтровать себя».
Это конкретная проблема, которую я нашел с 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()
Могу подтвердить, что мой S6 на Android 7 не смог правильно фильтровать Service UUID. Теперь нет выбора, кроме как фильтровать вручную все устройства. – Kevin
- 1. Сканирование устройства сбой андроида BLE
- 2. Сканирование BLE устройство не работает
- 3. Android: автоподключить устройства BLE
- 4. Android BLE Сканирование маяка
- 5. android не обнаруживает устройства BLE
- 6. Android BLE startLeScan сканирование для уже подключенного устройства
- 7. Как Android BLE Пассивное сканирование?
- 8. Android 4.4 BLE Сканирование Отсутствие стабильности
- 9. Сканирование устройства Bluetooth 4.0 не работает
- 10. BLE Scan не находит устройства BLE
- 11. Android не найдено ни одного устройства BLE
- 12. Android BLE, setCharacteristicNotification() не работает
- 13. Бесконечное Android BLE-сканирование для пакетов BLE-Beacon
- 14. Мастер BLE: сканирование при подключении
- 15. IOS Developpement: Background BLE-сканирование
- 16. Raspberry Pi 3 BLE сканирование
- 17. Android получает считывание температуры с устройства BLE
- 18. Как «ping» с Android BLE
- 19. Xamarin BLE сканирование только иногда
- 20. BLE Сканирование на неизвестную услугу
- 21. iOS - Сканирование BLE devies в фоновом режиме
- 22. Получить BLE-сканирование без дубликата фильтра UUID
- 23. Android BLE: Как проверить наличие подключенного устройства BLE для подключения
- 24. Сканирование BLE устройств на службе
- 25. Сканирование большого количества тегов BLE
- 26. Android - обнаружить BLE рекламу
- 27. Не получать данные с устройства BLE
- 28. BluetoothAdapter не остановит сканирование для BLE устройств
- 29. BLE Имя устройства irretrievable
- 30. Android BLE Beacon сканирование на разных моделях телефонов
Galaxy s6 имеет 5.0 + OS, поэтому вам нужно использовать ScanResult Listener ,,, startLeScan устарел. Проверьте Documentaion – IshRoid
та же проблема с 'BluetoothLeScanner.startScan (список фильтров, настройки ScanSettings, обратный вызов ScanCallback) 'method –
Alex
, тогда вы должны опубликовать код ,,, потому что метод должен работать, проблема с вашим кодом ,,, – IshRoid