对于应用的开发,往往会通过如下方式判断是否有开启定位权限
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