> 文档中心 > 解决open failed: EACCES,适配Android 11 动态申请外部存储权限

解决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框架,点击传送门