解决open failed: EACCES,适配Android 11 动态申请外部存储权限
突然发现以前在application中通过添加android:requestLegacyExternalStorage=“true” 的配置在Android11上面无效了,所以只能添加动态申请的过程了,具体如下:
注意:需要将CompileSdkVersion升级到30以上,否则无法使用部分api。
private static final int REQUEST_CODE = 1024; private void requestPermission() { if (Build.VERSION.SDK_INT >= 30 ){ // 先判断有没有权限 if (Environment.isExternalStorageManager()) { writeFile(); } else { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" +getApplication().getPackageName())); startActivityForResult(intent, REQUEST_CODE); } } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 先判断有没有权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { writeFile(); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); } } else { writeFile(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { writeFile(); } else { Toast.makeText(this,"存储权限获取失败",Toast.LENGTH_LONG).show();; } } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Environment.isExternalStorageManager()) { writeFile(); } else { Toast.makeText(this,"存储权限获取失败",Toast.LENGTH_LONG).show();; } } } /** * 模拟文件写入 */ private void writeFile() { Toast.makeText(this,"success",Toast.LENGTH_LONG).show();; }
如果还是拒绝,请在清单文件中添加android:preserveLegacyExternalStorage="true
参考链接
当然也可以使用郭神的PermissionX框架,点击传送门