首页 > 其他分享 >Android 10 定位权限问题

Android 10 定位权限问题

时间:2022-09-22 08:33:43浏览次数:105  
标签:10 permission ACCESS LOCATION Android 权限 定位 permissions

年后项目升级到了安卓10 (Api29), 这几天在写定位遇到了的定位权限以及回调问题,记录下

随着Android 对用户隐私和安全问题逐渐重视, 版本适配问题越来越多,对于开发者来说也是一件很头痛的事

Android Q (29) 新增后台定位权限: ACCESS_BACKGROUND_LOCATION ,

如果项目编译版本>=29 且想要使用前台定位则需要在AndroidManifest.xml 添加下面这句权限

    <!--定位权限 安卓9.0及以下用下-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!--定位权限,Android Q 新增后台定位权限-->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

申请权限需要判断编译版本了

//Android10以下申请定位权限
        String[] permissionsO = new String[]{
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION};
 
        //Android 10及以上申请定位权限
        String[] permissionsQ = new String[]{
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_BACKGROUND_LOCATION};
 
        String[] permissions = permissionsO;
 
        // 判断编译版本,如果大于等于29,就用permissionsQ
        if (Build.VERSION.SDK_INT >= 29) {
            permissions = permissionsQ;
        }

本以为这就完事了, 结果自测的时候在Android10上发现一个问题: 在申请权限的时候如果点击了 仅使用期间允许 的话会执行拒绝的回调, 正常的情况下, 我们一般会有这几种回调(允许, 拒绝,拒绝后不在询问)
image

//这是我基于RXpermission 自行封装的
PermissionUtil.requestLocation(new PermissionUtil.RequestPermission() {
            @Override
            public void onRequestPermissionSuccess() {
                //全部授权,开始定位
            }
 
            @Override
            public void onRequestPermissionFailure(List<String> permissions) {
                //拒绝,给个提示
               
            }
 
            @Override
            public void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions) {
                //拒绝后不在询问,给个弹窗,是否去设置界面
            }
        }, new RxPermissions(this));

经过Debug 发现, 在Android10手机上如果点击仅使用期间执行的话,android.permission.ACCESS_BACKGROUND_LOCATION 这个权限返回的值是 -1 , 说明这个权限是没有申请成功的
image
image
所以,我的思路就是在onRequestPermissionFailure 这回调判断下,未授权的权限集合长度等于1,并且这个权限还是 "android.permission.ACCESS_BACKGROUND_LOCATION" , 说明另外两个定位已经授权了,

//基于RXpermission 自行封装的
PermissionUtil.requestLocation(new PermissionUtil.RequestPermission() {
            @Override
            public void onRequestPermissionSuccess() {
                //全部授权,开始定位
            }
 
            @Override
            public void onRequestPermissionFailure(List<String> permissions) {
           
               if (null != permissions && permissions.size()==1 && permissions.contains("android.permission.ACCESS_BACKGROUND_LOCATION")){
                   //仅在运行期间允许,这个也是可以去定位的,就是无法使用后台定位,如果要使用后台定位,可以在这里做个提示
                }else {
                    //拒绝授权,给个提示
                } 
               
            }
 
            @Override
            public void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions) {
 
if (null != permissions && permissions.size()==1 && permissions.contains("android.permission.ACCESS_BACKGROUND_LOCATION")){
                   //仅在运行期间允许且不再询问
                }else {
                    //拒绝后不在询问,给个弹窗,是否去设置界面
                } 
                
            }
        }, new RxPermissions(this));

以上就是我遇到的问题和思路, 如果有更好的想法和意见,可以一起讨论哦
Android 10 定位权限问题

标签:10,permission,ACCESS,LOCATION,Android,权限,定位,permissions
From: https://www.cnblogs.com/sishuiliuyun/p/16717888.html

相关文章

  • 1102_REDIS中使用LUA
    定时删除公司费用查询费用并删除数据,保持原子操作准备数据saddsms:send:batchDeduct:company000002sismembersms:send:batchDeduct:company000002hgetallsm......
  • RAID10磁盘阵列
    RAID10的搭建RAID1的安全+RAID0的高速 添加4块10G的硬盘  使用mdadm工具创建级别为10的raid盘[root@node1~]#mdadm-C-v/dev/md10-l10-n4/dev/sdb/dev/sdc/dev/sdd......
  • Win10离线安装.NET Framework 3.5的方法技巧
    很多办公环境是没有外网的,而Win10又不自带.net3.5,导致很多运行在.net2.0\3.0\3.5的程序无法正常运行,所以存在Win10上离线安装.net3.5的需求。(比如我,,,查了一下午的资料文......
  • 200天1000题 (DAY 7)
    200天1000题(DAY7)目前总题数:32目前CF分数:1325T1(CodeforcesEdu.#130Div.2)C.awoo'sFavoriteProblem/* 题目大意: 给你两个字符串s,t 你可以对s进行如下......
  • T1052计算邮资 (信息学一本通C++)
     目录 [题目描述]根据邮件的重量和用户是否选择加急计算邮费。计算规则:重量在1000克以内(包括1000克),基本费8元。超过1000克的部分,每500克加收超重费4元,不足500克......
  • T1051 分段函数(信息学一本通C++)
     目录 [题目描述]编写程序,计算下列分段函数y=f(x)的值。 y=-x+2.5;0<=x<5 y=2-1.5(x-3)(x-3);5<=x<10 y=x/2-1.5;10<=x<20[输入]一个浮点数N......
  • T1054 三角形判断(信息学一本通C++)
     目录 [题目描述]给定三个正整数,分别表示三条线段的长度,判断这三条线段能否构成一个三角形。如果能构成三角形,则输出“yes”,否则输出“no”。[输入]输入共一行,包含......
  • T1053 最大数输出 (信息学一本通C++)
     目录 [题目描述]输入三个整数,数与数之间以一个空格分开。输出一个整数,即最大的整数。[输入]输入为一行,包含三个整数,数与数之间以一个空格分开。[输出]输出一行......
  • T1055 判断闰年 (信息学一本通C++)
     目录 [题目描述]判断某年是否是闰年。如果公元a年是闰年输出Y,否则输出N。[输入]输入只有一行,包含一个整数a(0<a<3000)。[输出]一行,如果公元a年是闰年输出Y,......
  • T1057 简单计算器(信息学一本通C++)
     目录 [题目描述]一个最简单的计算器,支持+,-,*,/四种运算。仅需考虑输入输出为整数的情况,数据和运算结果不会超过int表示的范围。然而:   1.如果出现除数为0......