我正在使用android BLE(低功耗蓝牙)。我在使用startLeScan(UUID[] serviceUuids, BluetoothAdapter.LeScanCallback callback)
方法扫描BLE设备时遇到问题,而startLeScan(BluetoothAdapter.LeScanCallback callback)
工作正常。
当我使用过滤器扫描特定的serviceUUID时,回调没有执行。我正在测试三星galaxy s6。我想知道这个问题是特定于设备还是扫描功能有一些错误。
答案 0 :(得分:9)
我很确定这不是特定于设备的。 首先,正如IshArt所提到的,你应该使用Android 5.0中的startScan。
grep
根据我的经验,如果您使用MAC地址但其他过滤器设置参数存在问题,则Scanfilters的实施工作正常:
startScan(List<ScanFilter> filters, ScanSettings settings, ScanCallback callback)
如果您不能选择此选项,则还可以实施自己的过滤器。如果将startScan()的过滤器列表保留为空,则忽略所有过滤并接收所有内容。然后在回调中,您可以编写自己的方法来检查结果是否符合您的要求。
答案 1 :(得分:2)
这是我在三星Galaxy S6上发现的一个特定问题。我使用较新的扫描仪API,仅支持Android 5.0及更高版本的设备。我的测试显示S4,(没有经过测试的S5),S7和S8全部工作;我不知道为什么S6有问题。
可悲的是,解决方法是在找到设备后手动在mac地址上进行过滤。
更新
这解决了我在Galaxy S6上遇到的问题。
以前,我在同一个ScanFilter
添加了两个条件(Kotlin):
ScanFilter.Builder()
.setServiceUuid(BluetoothBlind.Service.ParcelUUID)
.setDeviceAddress(macAddress)
.build()
更改它以将条件拆分为多个过滤器可以修复它:
ScanFilter.Builder()
.setDeviceAddress(macAddress)
.build()
ScanFilter.Builder()
.setServiceUuid(BluetoothBlind.Service.ParcelUUID)
.build()
答案 2 :(得分: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);
}
您可以根据需要自定义扫描方法,但是您必须知道,android 5
及以上的扫描方法有一个,另一个android
OS
< / p>
答案 3 :(得分:0)
BLE过滤扫描的问题是一个已知问题。有关此问题和其他BLE问题,请参阅https://github.com/iDevicesInc/SweetBlue/wiki/Android-BLE-Issues。结论很简单:&#34;您必须扫描所有设备并自行过滤。&#34;