Android在Android6.0以后加入了动态申请权限的功能,今天对动态权限总结一下
从Why,How两个方面介绍动态权限:
Why:因为我想使用在屏幕上打印log,所以搜索了下相关的代码,github上发现了一共工程.
github屏幕显示log源码在使用的过程中,使用了权限:
android.permission.SYSTEM_ALERT_WINDOWHow:于是查找了动态使用权限的内容
Android M 权限分类
安卓系统把权限分为了三类:
Normal Permissions
Dangerous Permissions
Special Permissions查了帮助
android.permission.SYSTEM_ALERT_WINDOW
这个是签名级的应用使用的权限
不获取系统签名是不能
沒有找到系统权限,所以这个问题暂时搁浅总结下permission的使用:
判断是否有权限
1. 检查
ActivityCompat.checkSelfPermission(activity,
permission) == PackageManager.PERMISSION_GRANTED
2.检查
checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
3.请求
ActivityCompat.requestPermissions(activity, permission, requestCode);
4,响应
public static boolean verifyPermissions(int[] grantResults) {
// At least one result must be checked.
if (grantResults.length < 1) {
return false;
}
// Verify that each required permission has been granted, otherwise return false.
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case PermissionUtils.PERMISSION_REQUEST_CODE:
if (PermissionUtils.verifyPermissions(grantResults)) {
// Permission Granted
// do you action
} else {
// Permission Denied
Toast.makeText(this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT)
.show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
没有获取权限的话:
查看是否显示请求许可理由
1.
ActivityCompat.shouldShowRequestPermissionRationale(activity,
permission)
2.
fragment.shouldShowRequestPermissionRationale(permission)
特殊权限:
请求
if (!Settings.canDrawOverlays(activity.getBaseContext())) {
Log.i(TAG, "Setting not permission");
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + activity.getPackageName()));
activity.startActivityForResult(intent, req);
响应
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PermissionUtils.PERMISSION_SETTING_REQ_CODE) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(this)) {
} else {
Toast.makeText(this, "not has setting permission", Toast.LENGTH_LONG).show();
finish();
}
}
}
AndroidManifest.xml添加
在标签级别!