Android Q之提前适配攻略(二)(后台定位适配)

转自:https://blog.csdn.net/qq_37199105/article/details/89632260

前言
本来是准备第二篇直接写AndroidQ的存储权限等方面的修改和适配的,但是可能是由于我学艺不精,在实践中发现AndroidQ表现的跟Google官方文档描述出入较大,所以目前还在摸索中,那么第二篇文章就先写AndroidQ关于定位权限的修改了。本文分为2个部分,改动解决方案和实践代码。

改动
AndroidQ新引入了后台定位权限,是危险权限需要代码动态申请

<!--允许App在后台获得位置信息-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
这个权限必须配合下面两个权限使用,单独写没有任何效果

<!--允许获得精确的GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--允许获得粗略的基站网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Google加入这个权限,意在将App是否能定位的权利分为前台和后台分别交给用户决定,减少App在后台静默定位的可能性,减少用户的个人信息的泄露。

此项改动将会针对所有版本编译的App生效,所以你无法通过修改targetSdkVersion来回避这个问题,由于老版本sdk没有对应的后台定位权限,如果不对AndroidQ进行适配,那么反而会造成无法正常运行的问题。

适配
1、权限申请

首先根据自己app的实际需求设置对应的权限,如果不是地图导航软件,运动计步软件这种需要持续进行定位的情况,其实大多数应用根本就不用申请后台定位这个权限,请工程师不要滥用权限。

首先要在AndroidManifest.xml文件中写入对应的权限。

<manifest>
    <!--允许获得精确的GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!--允许获得粗略的基站网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <!--允许App在后台获得位置信息-->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
</manifest>
在申请后台定位权限以前,用户必须先同意定位权限,否则后台定位权限将会被自动拒绝,所以如果你是一条一条申请权限的逻辑的话,需要先申请定位权限。

//android.permission.ACCESS_FINE_LOCATION或android.permission.ACCESS_COARSE_LOCATION
//任选其一申请定位权限
ActivityCompat.requestPermissions(this, 
new String[] {Manifest.permission.ACCESS_COARSE_LOCATION},
your-permission-request-code);
你会看到这样的申请界面

 

在确保用户同意了此权限以后,再申请后台权限

//申请后台权限
ActivityCompat.requestPermissions(this, 
new String[] {Manifest.permission.ACCESS_BACKGROUND_LOCATION},
your-permission-request-code);
你会看到后台请求的说明

得到这两个权限以后,既可以像老版本一样完成完全得到定位相关的权限了

当然你可以直接申请多个权限,AndroidQ对多个相同的权限组申请会合并成一个申请,所以我们也可以这么写

//同时申请所有定位权限,顺序不分先后
ActivityCompat.requestPermissions(this, 
new String[] {Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION},
your-permission-request-code);
这样就会得到3个选项的权限请求

这里需要注意的是,如果是老版本的app,点击仅在使用该应用期间允许,系统会认为你拥有全部定位权限,回调会提示得到所有权限,但是事实上你并不能后台定位,也不可以再次申请这个权限。

如果是AndroidQ适配以后,点击仅在使用该应用期间允许,系统会认为你允许了前台定位权限,但是拒绝了后台定位权限,所以这次请求回调会提示失败,有权限未通过。下次再执行这个申请时,系统会只申请后台定位权限。

到这一步适配权限就全部讲完了,那么下一步咱们就来浅谈一下具体的情景适配方法

应用场景
1、前台定位,不需要后台定位权限

2、后台定位,需要对应权限

总体来说跟以前的方法是一样的,所以这里只讨论由于后台定位权限的加入,引发的一种新的应用场景----没有后台定位权限,依然进行类后台定位。

看了上文,肯定有同学有疑问,就是如果我没有申请后台定位权限,是不是我就真的无法做到关掉界面得到定位信息呢?事实是,依然可以。或者我把这个需求换个说法,就是用户选择拒绝我的App后台定位权限,我如何来继续完成诸如导航,计步这种需要关掉界面后依然在持续定位的需求呢。答案显而易见:foregroundService(前台服务)

前台服务就算你把app放到后台了,当前没有Activity可见,系统依然可以认为你是在前台状态,所以不需要申请后台定位权限,也可以继续进行定位。具体做法改动如下

     <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        ...
    </service>
首先在AndroidManifest.xml里注册service,AndroidQ新加入了foregroundServiceType这个属性,请选择"location"

在启动前台服务之前,请确保您的应用仍可访问用户的位置信息:

boolean permissionAccessCoarseLocationApproved =
        ActivityCompat.checkSelfPermission(this,
            permission.ACCESS_COARSE_LOCATION) ==
            PackageManager.PERMISSION_GRANTED;
 
    if (permissionAccessCoarseLocationApproved) {
        // App有前台定位权限. 启动你的有"location"的前台服务
    } else {
       // 没有权限,发起前台定位权限申请
       ActivityCompat.requestPermissions(this, new String[] {
            Manifest.permission.ACCESS_COARSE_LOCATION},
           your-permission-request-code);
    }
打开对应的Service后,进行对应的定位操作就可以了。

后台定位的场景代码这里也翻译一下贴出来给大家,

boolean permissionAccessCoarseLocationApproved =
        ActivityCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION)
            == PackageManager.PERMISSION_GRANTED;
 
    if (permissionAccessCoarseLocationApproved) {
       boolean backgroundLocationPermissionApproved =
               ActivityCompat.checkSelfPermission(this,
                   permission.ACCESS_BACKGROUND_LOCATION)
                   == PackageManager.PERMISSION_GRANTED;
 
       if (backgroundLocationPermissionApproved) {
           // App可以访问前台和后台定位权限
           // 启动后台Service或者带“location”的前台Service
       } else {
           // App只能使用前台定位,显示一个Dialog提醒用户,你的App需要后台定位权限。
           // 然后申请后台定位权限
           ActivityCompat.requestPermissions(this, new String[] {
               Manifest.permission.ACCESS_BACKGROUND_LOCATION},
               your-permission-request-code);
       }
    } else {
       // App没有任何定位权限,重新申请全部定位相关权限
       ActivityCompat.requestPermissions(this, new String[] {
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_BACKGROUND_LOCATION
            },
            your-permission-request-code);
    }
总结
Android Q后台定位权限的更改总而言之就是,如果项目中没有用到后台实时定位,则并无多大改动;如果涉及到后台定位,那就需要同定位权限一同去申请授权即可。

 

展开阅读全文

没有更多推荐了,返回首页