由于位置许可,BLE 蓝牙扫描无法在 Android 10 和 11 上运行

Posted

技术标签:

【中文标题】由于位置许可,BLE 蓝牙扫描无法在 Android 10 和 11 上运行【英文标题】:BLE Bluetooth scanning is not working on Android 10 & 11 due to location permission 【发布时间】:2021-07-21 11:28:03 【问题描述】:

我正在研究 BLE 蓝牙扫描正在除 android 10 和 11 之外的所有设备上工作。更新应用程序后,Android 10 和 11 中的蓝牙扫描无法正常工作。 有时即使在允许位置权限之后,应用程序也必须从应用程序设置中重新授予权限。 为什么这不为人所知,而在现实中总是如此

if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) //代码在这里..

【问题讨论】:

除了授予权限外,您还必须启用位置扫描 在较新的Android版本中,粗略的位置权限是不够的;你需要好的位置。 【参考方案1】:

请根据操作系统版本验证是否实现了定位权限检查

    Android 8 (≥8):后台应用每小时只能检索几次用户的位置。

    在 Android 10(

    Android 10(≥10),后台位置作为独立资源而来。除了前台权限之外,应用程序还必须明确请求此权限。

    Android 11(≥11),后台位置权限不能和其他人同时申请。应用程序必须单独请求。此外,请求此权限不会立即提示用户其他权限,而是将用户带到/设置页面/位置权限会话,以便用户可以更新权限级别。

注意:有时当应用程序安装在工作模式配置文件中时,即使我们允许从应用程序设置权限,我们也必须手动启用权限设置

【讨论】:

【参考方案2】:

尝试在您的应用启动时使用requestPermissions 实际向用户请求权限:

// Request location permission, needed for BLE Scan
ActivityCompat.requestPermissions(this,
    new String[]
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION,
    2);

您可以在文档的this 页面上找到有关如何更好地处理此事件的更多信息。

【讨论】:

以上是关于由于位置许可,BLE 蓝牙扫描无法在 Android 10 和 11 上运行的主要内容,如果未能解决你的问题,请参考以下文章

检测位置的“蓝牙扫描”是不是打开

需要为 Android 6.0 上的蓝牙低功耗扫描启用位置

BLE低功耗蓝牙的广播内容

蓝牙 LE iOS 无法在后台扫描

Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码)

winform、wpf蓝牙扫描的三种方式