Android 6.0适配文档

Android 6.0系统在原有的AndroidManifest.xml声明权限的基础上新增了运行时权限动态检测,定位等权限也包含在其中。如果您的应用程序设置了 targetSdkVersion ≥ 23,则需要在调用定位功能前进行权限检查,权限检查的示例代码如下:

1.请求权限

@AfterPermissionGranted(1)
private void requirePermission() {
   String[] permissions = {
         Manifest.permission.ACCESS_COARSE_LOCATION,
         Manifest.permission.ACCESS_FINE_LOCATION,
         Manifest.permission.READ_PHONE_STATE,
         Manifest.permission.WRITE_EXTERNAL_STORAGE
   };
   String[] permissionsForQ = {
         Manifest.permission.ACCESS_COARSE_LOCATION,
         Manifest.permission.ACCESS_FINE_LOCATION,
         Manifest.permission.ACCESS_BACKGROUND_LOCATION, //target为Q时,动态请求后台定位权限
         Manifest.permission.READ_PHONE_STATE,
         Manifest.permission.WRITE_EXTERNAL_STORAGE
   };
   if (Build.VERSION.SDK_INT >= 29 ? EasyPermissions.hasPermissions(this, permissionsForQ) :
         EasyPermissions.hasPermissions(this, permissions)) {
      Toast.makeText(this, "权限OK", Toast.LENGTH_LONG).show();
   } else {
      EasyPermissions.requestPermissions(this, "需要权限",
            1, Build.VERSION.SDK_INT >= 29 ? permissionsForQ : permissions);
   }
}

2.请求权限结果处理

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
   super.onRequestPermissionsResult(requestCode, permissions, grantResults);
   EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}

这里使用了Google推荐的EasyPermission库进行权限申请示例,开发者也可以通过自己代码实现权限动态请求,使用EasyPermission库只需在build.gradle文件的dependencies下增加:

implementation 'pub.devrel:easypermissions:3.0.0'

Android 8.0 适配文档

从Android 8.0开始,出于降低功耗的目的,Android系统开始限制后台进程刷新定位结果的频率,每小时只能收到几次定位结果,腾讯定位SDK虽然还会按用户指定频率返回定位结果,但这些结果大部分都是缓存结果,为了适配8.0的策略,我们提供了后台定位方案,具体可以看功能使用中后台定位章节进行适配。

注意,如果您的应用已经存在前台服务,或者有其它任何手段可以保证进程一直处于前台,那么不需要使用我们提供的后台定位方案。


Android 9.0 适配文档

如果您的应用设置的targetSDK版本在28以上,同时需要使用我们的后台定位方案,请在Manifest清单文件中添加前台权限申请:

<!--如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

Android 10 适配文档

为了保护用户隐私,Android 10进一步对后台定位做了限制,如果开发者的应用targetSDK>=29,需要在Manifest清单文件中添加后台定位权限申请:

<!-- Android Q新增权限,允许应用在后台发起定位,如应用target为Q,请添加此权限 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

同时也需要在代码中动态申请该权限,如下:

   String[] permissionsForQ = {              
         Manifest.permission.ACCESS_BACKGROUND_LOCATION, //target为Q时,动态请求后台定位权限       
   };

如果开发者在程序中使用了我们的后台定位策略,请声明我们的前台服务类型为location

<service
    android:name="com.tencent.map.geolocation.s"
    android:foregroundServiceType="location" />

注意:我们在用户反馈中发现,有些品牌的手机即使在用户赋予了后台定位权限的情况下,依然无法及时的获取位置更新信息,这种问题一般是因为手机厂商在定制系统中做了相应的策略,需要开发者自己针对定制系统做调整。


Android 11 适配文档

Android 11对用户位置保护再次进行了升级,主要变更如下:

1.单次授权:

App动态申请定位权限时,出现的弹窗会新增一项【仅限这一次】的选项。该选项产生的效果如下:

a.如果应用在前台,即Activity处于可见状态,或有前台服务存在,应用可以持续获取位置。

b.如果应用进入后台,访问位置数据的权限会在一段时间后被收回。如果长时间处于后台导致权限被收回,应用会重启,位置权限被要重新授权。

2.后台访问权限:

位置权限申请的弹窗将不再出现【始终允许】的选项,如果仍需要后台定位,需要引导用户进设置页面开启【始终允许】。


Android 12 适配文档

Android 12 对用户可操作的定位权限的操作再次细化。新增了允许用户单独授予模糊定位权限。特性如下:

1.当应用以Android 12 为目标SDK版本时,请求位置权限时会出现允许用户选择高精定位还是模糊定位。ACCESS_COARSE_LOCATION权限必须申请,不能只申请ACCESS_FINE_LOCATION。否则系统忽略该次权限申请,并在Logcat里记录错误信息:ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION。

2.即使应用的目标SDK不是12,用户也可以进入设置界面,控制应用获取的定位权限精度。如果用户在应用设置界面开启模糊定位,系统会重启该应用进程。

3.如果用户仅授予了模糊定位权限,而应用又请求了ACCESS_FINE_LOCATION权限。再次请求权限时,权限弹窗会提示用户是否需要升级到高精定位。

这篇文章对您解决问题是否有帮助?

已解决
未解决