【发布时间】:2019-08-27 02:51:17
【问题描述】:
我正在开发一种检查 BLE 设备的解决方案,并使用 Android 附带的原生 API 来检查 BluetoothLeScanner。
想了解一些更好的操作,我拿了位置权限和蓝牙。
扫描开始后,我将手机上的蓝牙关闭,在Moto G2 Android 6.0 上,当我在我得到的已禁用蓝牙的日志中测试Samsung S8 Android 9 和Sony Xperia T2 Ultra Android 5.1 时,扫描仍然给我预期的结果并且扫描已停止。
我只有在购买时才能进行测试
bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
bluetoothAdapter = bluetoothManager.adapter
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
bluetoothScanner = bluetoothAdapter.bluetoothLeScanner
}
@TargetApi(Build.VERSION_CODES.M)
class BleScanCallback(resultMap: MutableMap) : ScanCallback() {
var resultOfScan = resultMap
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
@TargetApi(Build.VERSION_CODES.M)
override fun onScanResult(callbackType: Int, result: ScanResult?) {
addScanResult(result)
Log.v("Main Activity", "I found a ble device ${result}")
Log.v("Main Activity", "I found a ble device ${result?.device?.address}")
}
override fun onBatchScanResults(results: MutableList<ScanResult>?) {
results?.forEach { result -> addScanResult(result) }
}
override fun onScanFailed(errorCode: Int) {
Log.v("Main Activity","Bluetooth LE scan failed. Error code: $errorCode")
}
fun addScanResult(scanResult: ScanResult?) {
val bleDevice = scanResult?.device
val deviceAddress = bleDevice?.address
resultOfScan.put(deviceAddress, bleDevice)
}
scanResult 是在蓝牙在线时带上必要的信息,我已经如下图设置了
https://i.stack.imgur.com/o9jGRm.png
我发现这会让扫描变得更糟
【问题讨论】:
-
为什么蓝牙关闭时可以扫描BLE设备?你能提供任何文档链接吗?我可以链接THIS,第2点,开头是:接下来需要确保蓝牙已开启。
-
我认为操作类似于iOS,其中天线没有关闭并且正在接收能够识别设备的数据
标签: android kotlin bluetooth-lowenergy beacon