美文网首页Android开发经验谈互联网科技
安卓Q | 位置权限三态化解析,用户要关心,开发者须警惕

安卓Q | 位置权限三态化解析,用户要关心,开发者须警惕

作者: 技术爱好 | 来源:发表于2019-05-07 10:51 被阅读8次

为了进一步增强对用户隐私的保护,谷歌优化并收紧了应用使用位置权限的功能,在Android Q版本中应用在申请地理位置授权时增加了“使用时可用”和“始终可用”两个选择,并将这些控制权交到了用户手中,用户可以自行控制是否允许后台应用获知地理位置。

这种变化会对应用带来什么影响?应用开发者要如何兼顾版本特性和用户可能做出的选择?本文将重点讲解Android Q版本中位置权限变更对应用兼容性的影响及适配指导。

后台位置权限变更介绍

1、Android Q版本之前只有ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION,这两个权限都对应“仅前台使用允许”;

2、Android Q在原有权限基础上新增加了后台定位权限:ACCESS_BACKGROUND_LOCATION,该权限对应“始终可用”。

3、应用的targetSdkVersion<Q,谷歌提供了兼容性方案,只要应用申请了ACCESS_FINE_LOCATION或者ACCESS_COARSE_LOCATION权限,会默认请求ACCESS_BACKGROUND_LOCATION权限,动态授权弹框参考图1:

image

图1

4、应用的TargetSdkVersion≥Q时:

  • 如果应用功能需要始终定位,可以只申请ACCESS_BACKGROUND_LOCATION权限,权限弹框参考图2:
image

图2

  • 如果应用只需要前台定位,只申请对应前台使用的两个权限即可,具体授权弹框参考图3:
image

图3

  • 如果应用同时申请三个位置权限,则出现三态权限弹框,具体授权弹框参考图1。

5、如果用户选择仅前台使用允许,应用的页面退后台,通过启动前台服务让应用处于前台状态,必须把前台服务标为:foregroundServiceType=“location”,才能获取位置信息。

位置权限3态化对应用兼容性影响

Android Q版本之前,当用户授权应用位置权限后,这个应用就可以随时随地获取用户地理位置,位置权限3态化后会对地图类应用及后台导航类应用产生较大影响,需要应用开发者针对不同场景尽快进行适配工作,避免影响应用定位或导航功能无法使用问题。

位置权限3态化适配指导

地图&导航类应用后台导航场景

因为O版本的“后台位置限制”管控,建议地图类的应用通过前台服务让应用处于前台状态,不受“后台位置限制”管控,并且前台服务增加foregroundServiceType=“location”,避免Q版本前台服务位置限制,详情可参考如下步骤:

1、权限适配可以不申请ACCESS_BACKGROUND_LOCATION权限,只要申请老的位置权限即可:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

权限弹框存在两种可能:

  • 应用的TargetSdkVersion<Q:用户有两种选择,“仅前台使用允许”或“始终可用”,具体授权弹框参考图1;
  • 应用的TargetSdkVersion>=Q:用户只能设置仅前台使用,具体授权弹框参考图3。

2、用户选择始终允许,和Q之前一样没有差异,不存在问题;用户选择仅在前台使用时,需要应用适配前台服务的变更:

  • 设置前台服务的foregroundServiceType为“location”:
<service
android:name="MyNavigationService"
android:foregroundServiceType="location" ... >
 ...
</service>
  • 在启动前台服务记得检查是否有前台定位的权限:
boolean permissionAccessCoarseLocationApproved =
 ActivityCompat.checkSelfPermission(this,
 permission.ACCESS_COARSE_LOCATION) ==
 PackageManager.PERMISSION_GRANTED;
if (permissionAccessCoarseLocationApproved) {
// App has permission to access location in the foreground. Start your
// foreground service that has a foreground service type of "location".
} else {
// Make a request for foreground-only location access.
 ActivityCompat.requestPermissions(this, new String[] {
 Manifest.permission.ACCESS_COARSE_LOCATION},
 your-permission-request-code);
}

定期检查用户的位置场景

应用可能有一个用例,需要始终访问用户的位置,如用户与朋友或家人进行地理围栏和位置共享时。如果这些条件适用于应用,只要用户授予应用对其所在位置的全天候访问权限,应用就可以继续请求位置更新而无需任何更改:

权限适配,建议应用增加新的后台定位权限ACCESS_BACKGROUND_LOCATION申请,并且检查用户是否主动授予应用始终允许获取位置:

  • 新增权限申请:
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
  • 前台服务不需要设置foregroundServiceType为“location”;
  • 需要做好权限校验,看看用户是否设置的是始终允许,如果用户设置的是仅前台允许,那就会有问题了,需要应用弹出来始终需要定位的理由说明对话框,让用户授予始终允许定位,具体授权弹框参考图4:
image

图4

参考代码:

boolean permissionAccessCoarseLocationApproved =
 ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
 == PackageManager.PERMISSION_GRANTED;
if (permissionAccessCoarseLocationApproved) {
boolean backgroundLocationPermissionApproved =
 ActivityCompat.checkSelfPermission(this,
 Manifest.permission.ACCESS_BACKGROUND_LOCATION)
 == PackageManager.PERMISSION_GRANTED;
if (backgroundLocationPermissionApproved) {
// App can access location both in the foreground and in the background.
// Start your service that doesn't have a foreground service type
// defined.
 } else {
// App can only access location in the foreground. Display a dialog
// warning the user that your app must have all-the-time access to
// location in order to function properly. Then, request background
// location.
 ActivityCompat.requestPermissions(this, new String[] {
 Manifest.permission.ACCESS_BACKGROUND_LOCATION},
 BACKGROUND_LOCATION_PERMISSION_REQUEST_CODE);
 }
} else {
// App doesn't have access to the user's location at all. Make full request
// for permission.
 ActivityCompat.requestPermissions(this, new String[] {
 Manifest.permission.ACCESS_COARSE_LOCATION,
 Manifest.permission.ACCESS_BACKGROUND_LOCATION
 },
 LOCATION_PERMISSION_REQUEST_CODE);
}

其他只需前台获取位置信息场景

虽然不适配也不会出现问题,但建议应用升级TargetSdkVersion到Android Q,申请之前的两个权限,不需要申请ACCESS_BACKGROUND_LOCATION权限。这样系统弹框只有允许前台使用的选项,具体授权弹框参考图3。

更多信息可参考谷歌适配文档:
https://developer.android.google.cn/preview/privacy/device-location

相关文章

网友评论

    本文标题:安卓Q | 位置权限三态化解析,用户要关心,开发者须警惕

    本文链接:https://www.haomeiwen.com/subject/dazsoqtx.html