一、前言

随着安卓系统版本的变动,定位权限也多次被修改。随着变动次数的增多,但是对于不同的版本,不同的机型差异越来越大,在处理定位权限时,需要注意的地方就变多了。本篇主要记录对不同安卓版本,不同厂商机型定位权限的适配。

二、当前的定位权限

  1. 网络定位权限属于:ACCESS_COARSE_LOCATION
  2. GPS定位权限属于:ACCESS_FINE_LOCATION
  3. 后台定位权限:ACCESS_BACKGROUND_LOCATION

前台定位: 网络定位和GPS定位属于前台定位,应用在前台才能使用。

后台定位: 后台定位权限,应用在后台时也能使用定位。

注意: 一般来说使用定位功能申请GPS定位就足够了,只有当App在后台也需要定位功能时,才需要申请后台定位。在Android10开始,新增了后台定位权限,如果没有申请这个权限,当App在后台时,将无法使用定位功能。

三、后台定位注意点

3.1 android10的手机上targetSDK小于android10也需要做兼

后台定位权限(ACCESS_BACKGROUND_LOCATION)十分敏感,与其他新增的权限不太一样。android10的手机上targetSDK小于android10也需要做兼。在android10以上的手机,即使targetSdkVersion小于android10,如果用户没有主动授权后台定位权限,APP处在后台也将无法获取定位。

3.2 android 10系统上,可以在同一个权限弹窗中同时申请:ACCESS_FINE_LOCATION和 ACCESS_BACKGROUND_LOCATION权限。

class MainActivity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        requestPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION), 100)    }}

3.3 android 11系统上,将后台定位权限又做了一次调整。

targetSdkVersion=android11 时,不能同时申请普通定位权限和后台定位权限。
只有成功申请了 普通定位权限,才能申请后台定位权限。

  1. 直接申请后台定位权限,将不弹窗直接授权失败。
  2. 同时申请,普通定位权限和后台定位权限,将不会弹窗,直接授权失败。

四、不同厂商区别

在上面已经讲述了对于不同的安卓版本,申请权限时的区别,这里主要讲述对于不同的手机厂商,申请权限的区别,使用的安卓版本都比较新,都是安卓12版本。

4.1 华为鸿蒙系统

对于华为手机,直接申请网络定位或GPS定位即可,不需要考虑后台权限。华为定位权限只有【仅使用期间】和【始终允许】,所以直接申请就可以了。给了始终允许就代表有了后台定位权限。

  1. 单独申请ACCESS_COARSE_LOCATION,或者ACCESS_FINE_LOCATION,同时申请,都可以弹出弹窗。
  2. 不要单独申请后台定位,单独申请不会弹窗,直接授权失败。
  3. 弹窗点击禁止后,后续继续申请不会弹窗,直接授权失败,需要到系统中去设置。

4.2 小米手机

小米手机必须要先申请前台定位,只有在有了前台定位权限的情况下,才能去申请后台定位。两次申请都会有弹窗。

4.3 OPPO

必须要先申请前台定位,授权以后才能申请后台定位。并且申请后台定位的弹窗也是引导到系统设置中去开启后台定位。

4.4 VIVO

和OPPO一样,必须要先申请前台定位,授权以后才能申请后台定位。并且申请后台定位的弹窗也是引导到系统设置中去开启后台定位。

参考

Android R 11 后台定位权限没有 始终允许选项的解决方法
android定位权限适配看这篇就够了