我使用startScan
的{{1}}方法遇到了一个问题,但是发现BLE设备,但是当我关闭BLE设备时,我的手机仍然显示该设备为打开状态!
我尝试使用:
BluetoothLeScanner
伙计们,我还没有找到解决方案来检测BLE设备是否在其他资源中丢失,例如(Android SDK参考,论坛,stackoverflow等)(:
任何帮助将不胜感激!
答案 0 :(得分:0)
这个one看起来不错(JAVA):
据我了解,您需要实现startLeScan()。
要查找BLE设备,请使用startLeScan()方法。此方法将BluetoothAdapter.LeScanCallback作为参数。您必须实现此回调,因为这是返回扫描结果的方式。由于扫描会消耗大量电池,因此您应遵守以下准则:
找到所需设备后,立即停止扫描。 切勿循环扫描,并设置扫描时间限制。先前可用的设备可能已超出范围,并且继续扫描会耗尽电池电量。 以下代码片段显示了如何启动和停止扫描:
公共类DeviceScanActivity扩展了ListActivity {
private BluetoothAdapter mBluetoothAdapter;
private boolean mScanning;
private Handler mHandler;
// Stops scanning after 10 seconds.
private static final long SCAN_PERIOD = 10000;
...
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}, SCAN_PERIOD);
mScanning = true;
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
...
}
... }
答案 1 :(得分:0)
在谷歌搜索和浏览Android文档期间,我弄清楚了如何检测设备是否超出范围。我想分享我的解决方案:
...
public void scanBLEDevices(final boolean enable) {
if(mLeScanner == null) {
Log.d(TAG, "Could not get LEScanner object");
throw new InternalError("Could not get LEScanner object");
}
if (enable) {
startLeScan();
} else {
stopLeScan(false);
}
}
private void startLeScan() {
Log.i(TAG, "startLeScan(BluetoothLeScanner mLeScanner)");
mScanning = true;
mInRangeBtDevices.clear();
if (mStartScanCallback != null) {
mHandler.removeCallbacks(mStartScanCallback);
}
if (Build.VERSION.SDK_INT < 21) {
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mLeScanner.startScan(mScanFilters, mScanSettings, mScanCallback);
}
mStopScanCallback = new Runnable() {
@Override
public void run() {
stopLeScan(true);
}
};
mHandler.postDelayed(mStopScanCallback, SCAN_PERIOD);
}
private void stopLeScan(final boolean isContinueAfterPause) {
Log.i(TAG, "stopLeScan(BluetoothLeScanner mLeScanner)");
mScanning = false;
if (mStopScanCallback != null) {
mHandler.removeCallbacks(mStopScanCallback);
}
removeOutOfRangeDevices();
if (Build.VERSION.SDK_INT < 21) {
mBluetoothAdapter.stopLeScan(mLeScanCallback);
} else {
mLeScanner.stopScan(mScanCallback);
}
if (isContinueAfterPause) {
mStartScanCallback = new Runnable() {
@Override
public void run() {
startLeScan();
}
};
mHandler.postDelayed(mStartScanCallback, SCAN_PAUSE);
}
}
private void removeOutOfRangeDevices() {
final Set<String> outOfRangeDevices = new HashSet<>();
for (String btAddress : mBtDevices.keySet()) {
if (!mInRangeBtDevices.contains(btAddress)) {
outOfRangeDevices.add(btAddress);
}
}
for (String btAddress : outOfRangeDevices) {
final BluetoothDevice outOfRangeDevice = mBtDevices.get(btAddress);
mBtDevicesRSSI.remove(btAddress);
mBtDevices.remove(btAddress);
}
}
...
说明:
mInRangeBtDevices
上添加了一个集合,该集合将保留当前扫描期间找到的所有设备。outOfRangeDevices
从先前的列表中删除不再可用的设备我认为该示例将非常有用,您将能够将其集成到自己的代码中