【问题标题】:onBatchScanResults is not called in Android BLE在 Android BLE 中未调用 onBatchScanResults
【发布时间】:2014-11-20 12:50:20
【问题描述】:

我现在正在android开发中使用新的BLE api。

基本思路是使用蓝牙扫描结果来膨胀recyclerview(list);

我在谷歌开发者上关注了BLE guide

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

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

以下是两个核心函数的代码sn-p。

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);

【问题讨论】:

    标签: java android callback bluetooth-lowenergy ibeacon


    【解决方案1】:

    您是否获得批量结果或单个结果取决于您的扫描设置。

    1. 为了获得批处理结果,您需要调整ScanSettings。查看ScanSettings.Builder 的文档,并尝试使用SCAN_MODE_LOW_POWER,它会批量处理结果。您也可以尝试使用setReportDelay(long reportDelayMillis) 调整批处理间隔;你可以看到我写的一篇关于这些设置的力量优势的博文here.

    2. 您所说的“我的 BLE 扫描仪与其他应用程序相比要慢得多”的意思并不完全清楚,但可能是应用程序的 UI 滞后,因为您没有在 UI 线程上更新它。尝试像这样包装您对 notifyDatasetChanged 的​​调用:

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

    【讨论】:

    • 批量扫描结果需要使用flushPendingScanResults()吗?
    • 不,只有在您想早点拿到批次时才需要这样做。如果你只是等待,当操作系统决定发送它时你会得到它。
    • 阅读您的博客后,我有一个基本问题,这个 ble 扫描是否在后台运行?或者需要一项服务来完成这项工作? @davidgyoung
    • 在我在博客中描述的情况下,是的,Android Beacon 库在服务的后台运行扫描。
    • 谢谢,此刻我每次设置scansetting的reportDelay,我的nexus5的app都会出现SCAN_FAILED_FEATURE_UNSUPPORTED,好像是API的问题?
    【解决方案2】:

    试试setUseHardwareBatchingIfSupported(true)。这解决了我在 moto360 2nd gen 上的问题。我认为这是为较新的 API 自动实现的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多