首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扫描专用BLE器件的问题

扫描专用BLE器件的问题
EN

Stack Overflow用户
提问于 2021-05-06 05:54:30
回答 1查看 331关注 0票数 4

我是工作的BLE和必须扫描的BLE设备与特定的udid。

目前,所有BLE支持的设备都是扫描结果。

为了避免和只扫描特定的设备,我所做的如下:

代码语言:javascript
复制
fun startScanDevices(interval: Long = Constants.DEFAULT_SCAN_TIME_OUT,
                     connectedDevices: HashMap<String, BLEDeviceModel>? = null,
                     scanWithId: String? = null, context: Activity? = null) {
    this.context = context
    if (scanWithId != null)
        this.scanWithId = scanWithId
    if (isBluetoothEnabled) {
        clearDeviceList(connectedDevices)
        val BLP_SERVICE_UUID = UUID.fromString(UUID_OF_DEVICE)
        val serviceUUIDs = arrayOf<UUID>(BLP_SERVICE_UUID)
        var filters: MutableList<ScanFilter?>? = null
        if (serviceUUIDs != null) {
            filters = ArrayList()
            for (serviceUUID in serviceUUIDs) {
                val filter: ScanFilter = ScanFilter.Builder()
                        .setServiceUuid(ParcelUuid(serviceUUID))
                        .build()
                filters!!.add(filter)
            }
        }
        val scanSettings: ScanSettings = ScanSettings.Builder()
                .setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
                .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
                .setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)
                .setNumOfMatches(ScanSettings.MATCH_NUM_ONE_ADVERTISEMENT)
                .setReportDelay(1L)
                .build()
        mBluetoothAdapter?.bluetoothLeScanner?.startScan(filters,scanSettings,scanCallback)
        mScanning = true
        handler.postDelayed(stopScanningRunnable, interval)
    }
}

现在,在上面的方法中,您可以验证我将filtersscanSettings作为startScan方法的参数传递。

但是,有了这两个论点,我得出了以下错误:

2021-05-06 11:16:24.295 14669-14669/?E/AndroidRuntime:致命异常:主进程: com.dev,PID: 14669 java.lang.IndexOutOfBoundsException:索引: 0尺寸: com.ble.BLEManager$scanCallback$1.onBatchScanResults(BLEManager.kt:153),android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$2.run(BluetoothLeScanner.java:627),android.os.Handler.handleCallback(Handler.java:938),android.os.Handler.dispatchMessage(Handler.java:99),android.os.Looper.loop(Looper.java:246),java.lang.reflect.Method.invoke,android.app.ActivityThread.main(ActivityThread.java:8506),java.util.ArrayList.get(ArrayList.java:437)(原生方法)在com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

startScan()中的单个参数运行良好,如下所示--没有得到此错误:

代码语言:javascript
复制
mBluetoothAdapter?.bluetoothLeScanner?.startScan(scanCallback)

因此,错误出现在以下方法中:

代码语言:javascript
复制
override fun onBatchScanResults(results: List<ScanResult>) {
            results[0].device
            super.onBatchScanResults(results)
        }

编辑

删除了这个名为:onBatchScanResults的不必要方法,因为我使用的是onScanResult.

现在,错误不会出现,但是不能用过滤器和scanSettings扫描任何设备。

可能会有什么问题?请指点。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-05-14 08:23:01

步骤1)添加过滤器如下:

String[] filterNames = intent.getStringArrayExtra(FILTER_NAME_LIST);

String[] filterMacs = intent.getStringArrayExtra(FILTER_MAC_LIST);

String[] ignoreMacs = intent.getStringArrayExtra(IGNORE_MAC_LIST);

mFilter =新ScanServiceFilter.Builder() .filterNames(filterNames) .filterMacs(filterMacs) .ignoreMacs(ignoreMacs) .build();

步骤2:调用scanLeDevice()

scanLeDevice(真);

步骤3: scanLeDevice创建设置

代码语言:javascript
复制
                 ScanSettings settings = new ScanSettings.Builder()
                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                .setCallbackType(CALLBACK_TYPE_ALL_MATCHES)
                .setMatchMode(MATCH_MODE_AGGRESSIVE)
                .setNumOfMatches(MATCH_NUM_FEW_ADVERTISEMENT)
                .setReportDelay(0)
                .build();

        // We only want to scan for devices advertising our custom service
        ScanFilter scanFilter = new ScanFilter.Builder()
                .setServiceUuid(new ParcelUuid(UUIDConstants.RX_SERVICE_UUID)).build();
        if (mBluetoothLeScanner != null && mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
            mBluetoothLeScanner.startScan(Collections.singletonList(scanFilter), settings, mScanCallback);
            broadcastAction(new ScanBleActionEvent(ScanBleActionEvent.Actions.SCAN_STARTED));
        } else {
            bluetoothDeviceStopped();
        }

步骤4: on ScanCallback检查

代码语言:javascript
复制
    if (mFilter.passesFilter(scanDevice)) {
                filteredResults.add(scanDevice);
                broadcastAction(new ScanBleActionEvent(ScanBleActionEvent.Actions.SCANNED_DEVICE, scanDevice));
            }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67412584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档