使用过滤器的Android BLE设备扫描无效

时间:2015-12-03 11:44:33

标签: android bluetooth android-bluetooth bluetooth-lowenergy

我正在使用android BLE(低功耗蓝牙)。我在使用startLeScan(UUID[] serviceUuids, BluetoothAdapter.LeScanCallback callback)方法扫描BLE设备时遇到问题,而startLeScan(BluetoothAdapter.LeScanCallback callback)工作正常。
当我使用过滤器扫描特定的serviceUUID时,回调没有执行。我正在测试三星galaxy s6。我想知道这个问题是特定于设备还是扫描功能有一些错误。

4 个答案:

答案 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;