【问题标题】:identify BLE devices on Android / Kotlin with bluetooth off在蓝牙关闭的情况下识别 Android / Kotlin 上的 BLE 设备
【发布时间】:2019-08-27 02:51:17
【问题描述】:

我正在开发一种检查 BLE 设备的解决方案,并使用 Android 附带的原生 API 来检查 BluetoothLeScanner。

想了解一些更好的操作,我拿了位置权限和蓝牙。

扫描开始后,我将手机上的蓝牙关闭,在Moto G2 Android 6.0 上,当我在我得到的已禁用蓝牙的日志中测试Samsung S8 Android 9Sony 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


【解决方案1】:

在某些 Android 设备(包括 Pixel 手机、Android One 设备和未修改的 AOSP 版本)上,在快速设置面板中关闭蓝牙并不能真正关闭蓝牙。相反,它只是阻止蓝牙连接并在软件中配对,但允许蓝牙 LE 扫描继续不受影响。正如@Jorgesys 正确指出的那样,如果蓝牙无线电真的关闭,就不可能检测到 BLE 设备,所以让我再说一遍:尽管快速设置面板说了什么,但蓝牙不一定是关闭的。

在受支持的设备上,仅当满足以下两个条件时才会发生这种情况:

  1. 蓝牙已在完整设置菜单中打开(在 Android 9 上:设置 -> 连接的设备 -> 连接首选项 -> 蓝牙开启)
  2. 用户已选择“允许应用程序和服务随时扫描附近的设备,即使蓝牙已关闭。这可用于改进基于位置的功能和服务等。” (设置 -> 安全和位置 -> 位置 -> 高级 -> 扫描 -> 蓝牙扫描开启)

【讨论】:

    【解决方案2】:

    蓝牙关闭时无法检测 BLE 设备

    必须启用蓝牙

    Set up BLE

    在您的应用程序可以通过 BLE 进行通信之前,您需要 验证设备是否支持 BLE,如果支持,请确保 它已启用。

    【讨论】:

    • 非常感谢,我明白了.. 我认为这是可能的,甚至可以操纵硬件
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2016-10-21
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多