项目需求中遇到的
问题来自于用户会手动禁止app的权限,所以在使用某些权限的时候要判断一下当前app是否授权
直接代码记录
// 要申请的权限 private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};这个是读写权限
判断是否有权限
private boolean quanxian(){ // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 检查该权限是否已经获取 int i = ContextCompat.checkSelfPermission(this, permissions[0]); // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝 if (i != PackageManager.PERMISSION_GRANTED) { // 如果没有授予该权限,就去提示用户请求 return false; } } return true; }
没有权限弹出
// 提示用户该请求权限的弹出框 private void showDialogTipUserRequestPermission() { new AlertDialog.Builder(this) .setTitle("存储权限不可用") .setMessage("需要使用存储权限,您是否允许?(禁止后将无法选择上传图片)") .setPositiveButton("立即开启", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startRequestPermission(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); makeToast("用户取消授权"); // finish(); } }).setCancelable(false).show(); }
用户点击确定,开始请求
// 开始提交请求权限 private void startRequestPermission() { ActivityCompat.requestPermissions(this, permissions, 321); }
在onActivityResult获取是否授权
if (requestCode == 123) { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 检查该权限是否已经获取 int i = ContextCompat.checkSelfPermission(this, permissions[0]); // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝 if (i != PackageManager.PERMISSION_GRANTED) { // 提示用户应该去应用设置界面手动开启权限 showDialogTipUserGoToAppSettting(); } else { if (dialog3 != null && dialog3.isShowing()) { dialog3.dismiss(); } Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show(); } } }
// 提示用户去应用设置界面手动开启权限 private void showDialogTipUserGoToAppSettting(){ dialog3 = new AlertDialog.Builder(this) .setTitle("存储权限不可用").setMessage("请在-应用设置-权限-中,允许***使用存储权限") .setPositiveButton("立即开启",new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { // 跳转到应用设置界面 goToAppSetting(); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }).setCancelable(false).show(); } // 跳转到当前应用的设置界面 private void goToAppSetting() { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivityForResult(intent, 123); }