我正在使用android BLE(藍牙低功耗)。我在使用startLeScan(UUID[] serviceUuids, BluetoothAdapter.LeScanCallback callback)
方法
掃描BLE設備時遇到問題,而startLeScan(BluetoothAdapter.LeScanCallback callback)
工作正常。
當我使用過濾器掃描特定的serviceUUID時,回調沒有執行。我正在測試三星Galaxy s6。
我想知道這個問題是否是特定於設備的,或者在掃描功能中存在一些錯誤。Android BLE設備掃描過濾器不工作
回答
我很確定它不是特定於設備的。 首先,因爲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()的過濾器列表保留爲空,它將忽略所有過濾並接收所有內容。然後在回調中,您可以編寫自己的方法來檢查結果是否符合您的要求。
+1上的setDeviceAddress工作,但如果您使用單獨的過濾器並單獨添加,如我的答案的更新中所示,服務過濾器也可以工作。 如果您爲每個ScanFilter添加多個條件,它絕對是設備特定的。如果我在一次掃描中同時添加服務和mac地址條件,Galaxy S6完全不起作用。它適用於兩種掃描過濾器,每種條件都適用。 –
有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過濾掃描的問題是一個已知問題。有關此問題和其他BLE問題,請參閱https://github.com/iDevicesInc/SweetBlue/wiki/Android-BLE-Issues。結論很簡單:「您必須掃描所有設備並自行過濾。」
這是我用三星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()
可以確認我的S6在Android 7上無法正確過濾服務UUID。別無選擇,只能在所有設備上手動過濾。 – Kevin
- 1. Ble掃描設備Android
- 2. BLE掃描不能找到BLE設備
- 3. Android代碼不掃描BLE設備CC2650
- 4. Android列表設備掃描後的BLE設備
- 5. 同時廣播和掃描BLE設備
- 6. 掃描BLE設備的位置要求
- 7. 掃描Ble Android/getName()或設備不完整或無效
- 8. Android:掃描設備
- 9. 核心藍牙框架不掃描所有BLE設備和蘋果BLE設備
- 10. Android BLE startLeScan掃描已連接的設備
- 11. android SDK的條碼掃描器設備
- 12. BLE掃描不適用於Android
- 13. HBase掃描 - RowKey過濾器
- 14. Android工作室掃描ble模塊(藍牙4.0)
- 15. Android USB設備過濾器
- 16. 通過Android設備處理條碼掃描器的值
- 17. Xamarin BLE掃描僅有時
- 18. 掃描它不工作
- 19. 掃描BLE裝置不能正常工作
- 20. Android使用指紋掃描器作爲生物識別設備
- 21. 掃描BLE設備並將它們呈現在UITableView中
- 22. 如何掃描相同的BLE設備兩次?
- 23. 是否有可能減少掃描BLE設備的時間?
- 24. 簡單的Android BLE掃描儀
- 25. Android 4.4 BLE掃描缺乏穩定性
- 26. 如何Android BLE被動掃描?
- 27. 隱藏來自Genric BLE掃描儀應用程序的BLE設備
- 28. Zxing Qr代碼掃描器不能在所有設備上工作
- 29. 藍牙設備掃描不完整
- 30. Android Studio ZXsing QR掃描儀不工作
銀河S6具有5.0 + OS,因此您需要使用ScanResult Listener ,,, startLeScan已棄用。請檢查文檔 – IshRoid
BluetoothLeScanner的問題。startScan(列表過濾器,ScanSettings設置,ScanCallback回調)'方法 –
Alex
那麼你應該發佈的代碼,,,因爲該方法應該工作,在你的代碼的問題,,, – IshRoid