以拍照权限为例子:
1.监测并且申请
// 拍照 //使用兼容库就无需判断系统版本 int hasWriteStoragePermission = ContextCompat.checkSelfPermission(getApplication(), Manifest.permission.WRITE_EXTERNAL_STORAGE); int checkSelfPermission = ContextCompat.checkSelfPermission(getApplication(), Manifest.permission.CAMERA); if (hasWriteStoragePermission == PackageManager.PERMISSION_GRANTED && checkSelfPermission== PackageManager.PERMISSION_GRANTED ) { //拥有权限,执行操作 takePhoto(); }else{ //没有权限,向用户请求权限 ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100); }
2.同意,或者被 拒绝
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { //通过requestCode来识别是否同一个请求 if (requestCode == 100){ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ //用户同意,执行操作 takePhoto(); }else{ //用户不同意,向用户展示该权限作用 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { showPermissionsFailDialog(); } } } }
public void showPermissionsFailDialog() { //创建对话框创建器 AlertDialog.Builder builder = new AlertDialog.Builder(this); //设置对话框显示小图标 builder.setIcon(android.R.drawable.ic_dialog_alert); //设置标题 builder.setTitle("权限申请"); //设置正文 builder.setMessage("在设置-应用-权限 中开启相机、存储权限,才能正常使用拍照或图片选择功能"); //添加确定按钮点击事件 builder.setPositiveButton("去设置", new DialogInterface.OnClickListener() {//点击完确定后,触发这个事件 @Override public void onClick(DialogInterface dialog, int which) { //这里用来跳到手机设置页,方便用户开启权限 Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + mContext.getPackageName())); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } }); //添加取消按钮点击事件 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); //使用构建器创建出对话框对象 AlertDialog dialog = builder.create(); dialog.show();//显示对话框 }