关于定位权限的问题

本文讨论了Android应用中关于定位权限的问题,指出从5.1版本开始支持运行时权限。在低版本Android系统中,即使关闭定位权限,应用仍可能被视为授权状态。通过`dumpsys package`和`appops get`命令查看权限状态时,可能存在误导。通过反射获取AppOps的权限状态可以得到更准确的信息,但这种方法存在风险。
摘要由CSDN通过智能技术生成

对于应用的开发,往往会通过如下方式判断是否有开启定位权限

            int hasCallPhonePermission = MartinApplication.getInstance().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);
            int hasCallPhonePermission1 = MartinApplication.getInstance().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);

            if (hasCallPhonePermission != PackageManager.PERMISSION_GRANTED) {
                return false;
            }

其中ACCESS_COARSE_LOCATION表示大致定位,即通过网络定位,ACCESS_FINE_LOCATION表示精确定位,是通过GPS和网络来定位的。


这里有个问题,关于android定位等运行时权限问题,android是从版本5.1才开始支持的,即SDK版本,也就是 Build.VERSION_CODES.LOLLIPOP_MR1

而对于低版本的,则不支持运行时权限。

对于开发的应用设置为minSdkVersion版本低于22,那么在系统应用管理界面设置关闭定位权限的时候,系统会提示“该应用是针对低版本设计的,关闭权限可能导致问题”,如果选择关闭,那么其实系统并不会真的关闭该权限(代码位置packages/apps/PackageInstaller/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java : revokeRuntimePermissions()),而是会检查该项权限是否有AppOp权限,如果有,则会关闭AppOp权限(测试android7.0,关闭定位的AppOp其实并未起作用),然后也会给相应的权限添加flag : FLAG_PERMISSION_REVOKE_ON_UPGRADE,然后在应用升级到合适的版本之后再把相应的权限职位deny。


综上可知,如果想通过开始的那种方法获取应用权限开启状态的话,在低版本的应用中是无法成功的,结果都是granted=true。


附:

查看应用当前权限状态:

dumpsys package <packa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值