Android S 新特性介绍 - 近似定位,快速学会
| 拒绝 | 无定位权限 | 无定位权限 |
要确定当前系统赋予了什么权限给 App,你可以检查权限请求的返回值。你可以使用下面示例中的 Jetpack 库,也可以使用平台库进行权限申请和返回值获取。具体可参考:[manage the permission request code yourself](
)
val locationPermissionRequest = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->when {permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {// Precise location access granted.}permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {// Only approximate location access granted.} else -> {// No location access granted.}}}
// ...
// Before you perform the actual permission request, check whether your app// already has the permissions, and whether your app needs to show a permission// rationale dialog. For more details, see Request permissions.locatio
nPermissionRequest.launch(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION))
用户选择同样可以影响后台定位
如果系统赋予 App ACCESS_BACKGROUND_LOCATION,用户在定位权限弹框的选择同样会影响后台定位。 例如,如果用户允许 ACCESS_BACKGROUND_LOCATION,但是只允许前台使用近似定位,那么 App 也只能拥有近似定位权限在后台。
升级为精确定位
近似定位可能影响那些依赖 ACCESS_FINE_LOCATION 权限的 App.
当咨询用户许可精确定位的时候,请务必确认 App 是否真的需要精度如此之高的定位。如果 App 需要和附近的蓝牙或者 WIFI 进行连接,请确认使用[companion device pairing](
)或者[Bluetooth permissions](
)来替代 ACCESS_FINE_LOCATION 权限。
要请求用户将你的应用的位置访问从近似升级到精确,请执行以下操作:
在必要的时刻,澄清为何需要此类权限
再次同时获取 ACCESS_COARSE_LOCATION 和 ACCESS_FINE_LOCATION 权限。因为用户之前已经允许系统给予近期定位权限给 App,本次的权限申请弹框显示不一样,如下图:
测试 App 使用近似定位
为了评估是否需要升级 app 来支持用户定制定位精确度,请完成一下的测试。
处理弹窗近似定位请求
为了确认 App 是否可以处理用户通过弹窗允许 App 近期定位权限需求,请执行以下步骤:
同时申请 ACCESS_COARSE_LOCATION 和 ACCESS_FINE_LOCATION 权限
在本文图二示例中,选择顶部近似定位选项,然后选择底部的仅在此应用运行时或者仅此次。
确认 App 是否工作正常,在只有近期定位的情况下。
从系统设置中降级为近期定位
为了确认 App 是否可以处理用户从设置中将精确定位降级成近似定位请求,请执行以下步骤:
同时申请 ACCESS_COARSE_LOCATION 和 ACCESS_FINE_LOCATION 权限
在本文图二示例中,选择顶部精确定位选项,然后选择底部的仅在此应用运行时或者仅此次。
打开设置中应用权限界面
在应用权限界面关闭精确定位,如下图:
评论