在Android中,进行蓝牙设备扫描startDiscovery需要申请位置权限,但有的时候并不需要申请位置权限,就有了android:usesPermissionFlags="neverForLocation",设置这个就不用申请位置权限来进行蓝牙扫描。
android:usesPermissionFlags="neverForLocation"
是 Android 中用于在应用的 AndroidManifest.xml
文件中声明权限使用标志的一个属性。具体来说,这个标志与蓝牙扫描相关联,旨在向用户和系统表明应用程序请求蓝牙权限的目的不是为了进行位置跟踪或获取用户的位置信息。
背景
自 Android 12(API 级别 31)起,Google 引入了更严格的隐私保护措施,其中包括对蓝牙扫描权限的管理。以前,应用程序可能只需要蓝牙权限就能访问蓝牙功能,但这些功能也可能被间接用于推断用户的位置,例如通过蓝牙信标进行室内定位。为增强用户隐私保护,Android 提供了一种机制让开发者明确声明他们的蓝牙扫描活动不会用于位置跟踪。
使用场景
当你开发的应用程序需要执行蓝牙扫描操作,但不打算用此操作来确定用户的位置时,可以使用 android:usesPermissionFlags="neverForLocation"
来声明这一点。这有助于增加用户的信任度,并可能简化权限请求流程,因为在这种情况下,应用不需要请求位置相关的权限。
如何使用
要在你的应用中声明蓝牙权限且不用于位置跟踪,可以在 AndroidManifest.xml
文件中的 <uses-permission>
标签内添加 android:usesPermissionFlags
属性。例如:
xml
深色版本
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.bluetoothapp"><uses-permission android:name="android.permission.BLUETOOTH_SCAN"android:usesPermissionFlags="neverForLocation"/><!-- 其他配置 -->
</manifest>
在这个例子中,BLUETOOTH_SCAN
权限被声明为“永不用于位置”,这意味着该应用承诺不会利用蓝牙扫描的结果来进行位置跟踪。
注意事项
- 权限请求:即使指定了
neverForLocation
标志,如果您的应用还需要其他涉及位置数据的功能,则仍需请求相应的位置权限。 - 用户体验:明确声明蓝牙权限不用于位置跟踪可以帮助提高用户的信任感,因为它清楚地传达了应用收集数据的目的。
- 兼容性:
android:usesPermissionFlags="neverForLocation"
只适用于 Android 12 及以上版本。对于较低版本的 Android 系统,您需要确保应用的行为符合当时的权限模型要求。
总结
android:usesPermissionFlags="neverForLocation"
是一个重要的隐私保护特性,允许开发者更加透明地向用户展示他们如何使用蓝牙权限。这对于那些确实不需要位置信息的应用程序来说是一个很好的工具,可以帮助减少不必要的权限请求,并提升用户对应用的信任度。然而,开发者应确保遵守这一声明的实际含义,在应用逻辑中避免使用蓝牙扫描结果进行任何形式的位置跟踪。
参考:
【android bluetooth 协议分析 03】【蓝牙扫描详解 2】【app触发蓝牙扫描后,协议栈都做了那些事情】_android 经典蓝牙扫描流程源码分析-CSDN博客
《Android学习笔记》Android12蓝牙扫描不到设备的权限问题_android:usespermissionflags="neverforlocation-CSDN博客