java – onBatchScanResults未在Android BLE中调用

前端之家收集整理的这篇文章主要介绍了java – onBatchScanResults未在Android BLE中调用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我现在在 android开发中使用新的BLE api.

基本思路是使用蓝牙扫描结果来扩充recyclerview(列表);

我跟着谷歌开发者的BLE guide

现在我有两个问题:
1. onBatchScanResults监听器永远不会被触发,但是onScanResult效果很好,那是因为扫描仪只能感知附近的1个传感器吗?

>与其他应用程序相比,我的BLE扫描仪要慢得多.

以下是两个核心功能代码片段.

private void scanBLE(boolean enable) {
    final BluetoothLeScanner mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
    if (enable) {
        mScanning = true;
        mBluetoothLeScanner.startScan(mScanCallback);        
    } else {
        if (mScanning) {
            mScanning = false;
            mBluetoothLeScanner.stopScan(mScanCallback);
        }
    }

    Log.i(TAG,"now the scanning state is" + mScanning);
}

// Device scan callback.
private ScanCallback mScanCallback =
        new ScanCallback() {
    public void onScanResult(int callbackType,android.bluetooth.le.ScanResult result) {
        addBeaconTolist(result,beaconsList);
        mAdapter.notifyDataSetChanged();
    };

    public void onScanFailed(int errorCode) {
        Log.i(TAG,"error code is:" + errorCode);
    };

    public void onBatchScanResults(java.util.List<android.bluetooth.le.ScanResult> results) {
        Log.i(TAG,"event linstener is called!!!!");
        Log.i(TAG,"batch result are:" + results);
        beaconsList.clear();
        for (int i = 0; i < results.size(); i++) {
            ScanResult result = results.get(i);
            addBeaconTolist(result,beaconsList);
        }
        mAdapter.notifyDataSetChanged();
    };

};

在MainFragment中如下:

beaconsList = new ArrayList<BeaconsInfo>();

    mAdapter = new BeaconsAdapter(beaconsList);
    mRecyclerView.setAdapter(mAdapter);

    scannBLE(true);

解决方法

是否获得批处理结果或单个结果取决于您的扫描设置.

>要获得批处理结果,您需要调整ScanSettings.查看ScanSettings.Builder的文档,并尝试使用SCAN_MODE_LOW_POWER,它会对结果进行批量处理.您还可以尝试使用setReportDelay(long reportDelayMillis)调整批处理间隔;你可以看到我写的关于这些设置here.功能优势的博客文章
>我的意思并不完全清楚“我的BLE扫描程序与其他应用程序相比要慢得多”,但可能是应用程序的UI滞后,因为您没有在UI线程上更新它.尝试将您的调用包装到notifyDatasetChanged,如下所示:

runOnUiThread(new Runnable() {
  @Override
  public void run() {
     mAdapter.notifyDataSetChanged();
  }
});

猜你在找的Android相关文章