Android Q 隐私篇(2) - 后台定位权限
文章目录
本篇是系列第二篇, 主要分析下 android Q 下的后台定位权限 官方链接 , 有能力的朋友可以自己阅读,并不难
定位权限
在从前的 android 中,定位权限不分前后台,只有两个
1<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
2<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
分别代表大致位置和精确位置, 一般来说在使用时定位权限都是一起要或者都不要的, 而且这两个作为同一个组,一般都是一起申请,一次授权
一般来说大部分人都是使用高德/百度地图作为定位 sdk 使用, 很显然这两个货申请一般也是都一起申请的
androidQ 的权限
androidQ 中会添加一个新的权限
1 <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
这个就是对应的后台权限, 和以前的分类方式不同,以前是精确度,这个是前后台
按照官方说明:
- targetVersion: androidQ 或以上
- 如果 targetVersion 是 androidQ+, 则这个权限不会自动添加, 使用者需要自己添加,有就是有,没有就没有
- 如果 targetVersion 是 api 28(android 9.0)以下
- 如果你有以前版本的定位权限,则系统会在安装时帮你添加后台的权限(升级 androidOS 版本时不明)
- 在动态权限申请时,如果你申请的权限有以前的定位权限之一, 则会自动帮你在申请的权限里加上这个后台的
请求后台权限
上来是一段废话...
简单解释, 你需要后台权限吗?
- 不需要
- 需要
这个不是我们自己能定的, 以国内来看, 接 sdk (推送,定位,分享...)就要, 不接也要
如果不需要
请参考 官方示例
Service 中声明一个前台定位的 type 类型
1<service
2 android:name="MyNavigationService"
3 android:foregroundServiceType="location" ... >
4 ...
5</service>
如果需要
需要的情况下, 如果是在 service 里面做请求定位的逻辑, 请保证每一次都要运行时权限检查, 因为用户随时可以关闭应用的后台权限
如果用户仅允许你前台访问定位权限, 但你的应用没有后台定位权限会影响应用的运行,则应该友好的提示用户给予权限(自定义对话框), 当 TA 允许时再请求后台权限
官方给的示例如下
1val permissionAccessCoarseLocationApproved = ActivityCompat
2 .checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION) ==
3 PackageManager.PERMISSION_GRANTED
4
5if (permissionAccessCoarseLocationApproved) {
6 val backgroundLocationPermissionApproved = ActivityCompat
7 .checkSelfPermission(this, permission.ACCESS_BACKGROUND_LOCATION) ==
8 PackageManager.PERMISSION_GRANTED
9
10 if (backgroundLocationPermissionApproved) {
11 // App can access location both in the foreground and in the background.
12 // Start your service that doesn't have a foreground service type
13 // defined.
14 } else {
15 // App can only access location in the foreground. Display a dialog
16 // warning the user that your app must have all-the-time access to
17 // location in order to function properly. Then, request background
18 // location.
19 ActivityCompat.requestPermissions(this,
20 arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
21 your-permission-request-code
22 )
23 }
24} else {
25 // App doesn't have access to the device's location at all. Make full request
26 // for permission.
27 ActivityCompat.requestPermissions(this,
28 arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,
29 Manifest.permission.ACCESS_BACKGROUND_LOCATION),
30 your-permission-request-code
31 )
32}
设备升级时的迁移方案
如果你需要后台权限, 则
- 在 Manifest 中加上权限
- 并在代码的动态权限申请中加入后台权限的相关代码
如果不需要,则代码不需要做任何变动
需要注意的几个点
如果用到了位置权限,则需要特殊处理的:
- 您的应用程序无权访问位置信息。
- 您的应用程序无权访问位置在后台运行时的信息。
不处理可能会崩溃或者用户体验不好
后记
本篇没什么代码, 所以示例代码仓库中没有做任何修改
以上