一、其实Android11(targetSdkVersion 30)及以上在AndroidManifest.xml声明MANAGE_EXTERNAL_STORAGE权限(不在AndroidManifest.xml声明获得“所有文件访问权限”按钮为灰色不能授权)在加上下面的判断就能基本解决问题:
//获取存储权限 private void getPermissions() { // 普通权限:只需要在清单文件中注册即可 // 危险权限(Android 6.0 之后):需要在代码中动态申请,以弹系统 Dialog 的形式进行请求 // 特殊权限(Android 11(含) 之后):需要在代码中动态申请,以跳系统 Activity 的形式进行请求 //android版本大于等于11 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//必须要MANAGE_EXTERNAL_STORAGE权限,但Google Play Console审核不通过 // 先判断有没有权限 if (Environment.isExternalStorageManager()) { new Thread(saveFileRunnable).start(); } else { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, 0); } } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //存储空间权限 requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); } else { //有权限后需要处理的功能 } } else { //有权限后需要处理的功能 } } // 提示是否獲取存储空间权限 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 0: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 取得权限 //有权限后需要处理的功能 } else {// 未取得权限 Toast.makeText(getApplicationContext(), getString(R.string.language_noPermissions), Toast.LENGTH_SHORT).show(); } break; } } /