我现在在Android开发中使用新的BLE api。
基本思路是使用蓝牙扫描结果来扩充recyclerview(列表);
我关注了谷歌开发者的BLE guide
现在我有两个问题:
1. onBatchScanResults
听众永远不会被触发,但是onScanResult
效果很好,是因为扫描仪只能感知附近的1个传感器吗?
以下是两个核心功能'代码段。
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);
答案 0 :(得分:17)
是否获得批量结果或单个结果取决于您的扫描设置。
要获得批量结果,您需要调整ScanSettings
。查看ScanSettings.Builder
的文档,然后尝试使用SCAN_MODE_LOW_POWER
批量处理结果。您也可以尝试使用setReportDelay(long reportDelayMillis)
调整批处理间隔;您可以看到我撰写的关于这些设置的强大功能的博客文章here.
“我的BLE扫描程序与其他应用程序相比要慢得多”并不完全清楚你的意思,但可能是应用程序的UI滞后,因为你没有在UI线程上更新它。尝试将您的调用包装成notifyDatasetChanged,如下所示:
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});
答案 1 :(得分:0)
试试setUseHardwareBatchingIfSupported(true)
。这解决了我在moto360第二代的问题。我认为这是针对较新的API自动实现的。