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