Android BLE中未调用onBatchScanResults

时间:2014-11-20 12:50:20

标签: java android callback bluetooth-lowenergy ibeacon

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

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

我关注了谷歌开发者的BLE guide

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

  1. 我的BLE扫描仪与其他应用程序相比要慢得多。
  2. 以下是两个核心功能'代码段。

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

2 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:0)

试试setUseHardwareBatchingIfSupported(true)。这解决了我在moto360第二代的问题。我认为这是针对较新的API自动实现的。