本篇是系列第二篇, 主要分析下 android Q 下的后台定位权限 官方链接: https://developer.android.com/preview/privacy/device-location , 有能力的朋友可以自己阅读,并不难

目录

定位权限

在从前的 android 中,定位权限不分前后台,只有两个

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

分别代表大致位置和精确位置, 一般来说在使用时定位权限都是一起要或者都不要的, 而且这两个作为同一个组,一般都是一起申请,一次授权

一般来说大部分人都是使用高德/百度地图作为定位 sdk 使用, 很显然这两个货申请一般也是都一起申请的

androidQ 的权限

androidQ 中会添加一个新的权限

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

这个就是对应的后台权限, 和以前的分类方式不同,以前是精确度,这个是前后台

按照官方说明:

  1. targetVersion: androidQ 或以上
    1. 如果 targetVersion 是 androidQ+, 则这个权限不会自动添加, 使用者需要自己添加,有就是有,没有就没有
  2. 如果 targetVersion 是 api 28(android 9.0)以下
    1. 如果你有以前版本的定位权限,则系统会在安装时帮你添加后台的权限(升级 androidOS 版本时不明)
    2. 在动态权限申请时,如果你申请的权限有以前的定位权限之一, 则会自动帮你在申请的权限里加上这个后台的

请求后台权限

上来是一段废话… 20190521093402.png

简单解释, 你需要后台权限吗?

  • 不需要
  • 需要

这个不是我们自己能定的, 以国内来看, 接 sdk (推送,定位,分享…)就要, 不接也要

如果不需要

请参考官方示例

Service 中声明一个前台定位的 type 类型

<service
    android:name="MyNavigationService"
    android:foregroundServiceType="location" ... >
    ...
</service>

如果需要

需要的情况下, 如果是在 service 里面做请求定位的逻辑, 请保证每一次都要运行时权限检查, 因为用户随时可以关闭应用的后台权限

如果用户仅允许你前台访问定位权限, 但你的应用没有后台定位权限会影响应用的运行,则应该友好的提示用户给予权限(自定义对话框), 当 TA 允许时再请求后台权限

官方给的示例如下

val permissionAccessCoarseLocationApproved = ActivityCompat
    .checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION) ==
    PackageManager.PERMISSION_GRANTED

if (permissionAccessCoarseLocationApproved) {
   val backgroundLocationPermissionApproved = ActivityCompat
       .checkSelfPermission(this, 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,
           arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
           your-permission-request-code
       )
   }
} else {
   // App doesn't have access to the device's location at all. Make full request
   // for permission.
   ActivityCompat.requestPermissions(this,
       arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,
               Manifest.permission.ACCESS_BACKGROUND_LOCATION),
       your-permission-request-code
   )
}

设备升级时的迁移方案

如果你需要后台权限, 则

  1. 在 Manifest 中加上权限
  2. 并在代码的动态权限申请中加入后台权限的相关代码

如果不需要,则代码不需要做任何变动

需要注意的几个点

如果用到了位置权限,则需要特殊处理的:

  1. 您的应用程序无权访问位置信息。
  2. 您的应用程序无权访问位置在后台运行时的信息。

不处理可能会崩溃或者用户体验不好

后记

本篇没什么代码, 所以示例代码仓库中没有做任何修改

以上