安卓6.0以后,一些危险权限不仅需要在AndroidManifest.xml中写入权限,还需要在代码中动态申请
本文以文件读写权限为例:
权限申请分三步
1.检查是否有读写权限(读和写申请一个即可获得读写权限)
2.申请权限
3.权限申请的结果
代码:检查权限
//检查申请权限
private void checkPermission() {
//检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权
if (!hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//用户已经拒绝过一次,再次弹出权限申请对话框需要给用户一个解释
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission
.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(this, "请开通相关权限,否则无法正常使用本应用!", Toast.LENGTH_SHORT).show();
}
//申请权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
} else {
Log.i("hebaodan", "checkPermission: 已经授权!");
}
}
/**
* 判断是否有某个权限
*
* @param context
* @param permission
* @return
*/
public static boolean hasPermission(Context context, String permission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Android 6.0判断,6.0以下跳过。在清单文件注册即可,不用动态请求,这里直接视为有权限
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
权限申请结果回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) { //REQUEST_CODE对应申请权限时的REQUEST_CODE
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();
Log.i("hebaodan_permission", "checkPermission: 已经授权!3333");
}
}
}