标签:
Android 6.0 Marshmallow首次加入了运行时权限管理,这对用户来说,可以更好的了解、控 制 app 涉及到的权限。然而对开发者来说却是一件比较蛋疼的事情,需要兼容适配,并保证程序功能的正常运行。
什么叫运行时权限管理呢?在Android 6.0以下的系统中,当我们在安装应用的时候,该应用就会提示我们这个应用所需要的权限,如果你要安装,那就必须同意赋予所有权限,但是如果不同意,那就只能取消安装了,有点流氓。而且安装完后,你不可以收回这个权限。
而6.0就做到了运行时权限管理,即使安装的时候给了权限,也可以到系统设置里,去关闭该权限。
下面分几种情况来讲,因为运行时权限只有在Android6.0及以上的手机版本才有,所以这里只考虑设备版本大于6.0的手机,低版本的手机在安装时就已经赋予了所有的权限,也不可能收回,就不考虑了,下面的情况只分targetSdkVersion:
checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
如果该权限已经被授予,那么可继续执行你的代码,如果未授予,则需要向用户询问是否需要授予权限,弹出的框是系统界面,界面如下:
调用代码:
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
系统询问是否授予权限的页面结束后会有回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
//your implementations
}else{
ToastUtil.show(this, "权限不足,支付失败");
}
}
}
我已经在stackoverflow上提问了,但是还没人回答,我也还没找到原因和官方说法,不过有些人说targetSDKVersion小于23的app,只能通过卸载应用才能收回权限,这些猜想尚未证实。
不过我猜想如果你要支持runtime permission的话,还是要把targetSDKVersion设为23。如果你的targetSDKVersion是小于23的话,那么还是要加上checkSelfPermission,以防万一,谁知道google会出什么坑。
还有就是权限的话,有分组的概念,看如下图:
如果一组中有一个被授予了,那么组内的也会默认被授予。
而且也支持同时申请多个权限,具体情况android developer官网。
下面是stackoverflow问题的网址:
http://stackoverflow.com/questions/36328151/ive-revoke-the-android-permission-but-checkselfpermission-still-return-granted
如有问题和错误的地方请指出。
标签:
原文地址:http://blog.csdn.net/lintcgirl/article/details/51029691