API23以上的运行时权限
Android的权限机制从第一个版本就有了,一些软件,不管用不用的到这些权限,都先申请了再说。比如某企鹅,安装软件时可以看到它要了读取和发送信息的权限,嘿嘿嘿,话说要这权限干嘛,。。。。
然后Android针对这些问题,在Android 6.0(API23)时安卓加入了运行时权限,从而更好的保护了用户的隐私安全。
-
就是用户不需要再安装软件的的时候一次性授权所有的权限,而是在软件使用过程中针对某一些权限进行申请,当然,一般情况下,拒绝权限不会退出程序(万恶的某博,不给手机通讯录打电话权限就退出),而是可以用别的功能。
-
并不是所有的权限都要在运行时申请,这样得多麻烦。Android将权限分为了两类,1 普通权限,2 危险权限
普通权限就是说不会直接威胁到用户的安全和隐私。这些权限系统会自动授权,只要你声明了。
危险权限就是涉及用户隐私的。这些就要运行时动态申请了
普通权限和危险权限
- Android系统有上百种权限,危险权限如下表,其他的就是普通权限了
需要注意的是
表格中每个权限都属于一个权限组,要是申请了权限组的一个权限,那么该权限组的所有权限都会同时被授权。比如,申请了WRITE_EXTERNAL_STORAGE这个权限,那么和它在同一权限组的READ_EXTERNAL_STORAGE也会同时被授权!
不在这张表的权限可以直接在manifest文件里声明就行了(API23以上),不过平时为了兼容低版本,任何权限都要声明在manifest文件里,然后在Activity中针对API23以上申请运行时权限
动态申请运行时权限
一般情况下,比如,申请读写内存卡权限
Manifest.permission.WRITE_EXTERNAL_STORAGE
在Activity的onCreate里
//判断权限够不够,不够就给
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 1);
} else {
//权限够了这里处理逻辑
Log.d(TAG, "权限够了");
}
Activity里加上回调,控制权限申请窗口弹出来的的逻辑
//获取到权限回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[]permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//权限够了处理逻辑
Log.d(TAG, "权限够了,逻辑");
} else {
Toast.makeText(this, "权限不够,程序将退出", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
break;
}
}
声明权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
然后运行,点击拒绝就直接finish()了
Gradle集成
推荐的开源库:
PermissionsDispatcher
中文版本: PermissionsDispatcher使用详解
使用:
使用PermissionsDispatcher轻松解决Android权限问题
另一种思路:
Android 6.0运行时权限简析及最佳实践
参考