将图像文件写入 SD 卡时出现“权限被拒绝”错误

问题描述

我正在使用一个演示项目来获取图像并将其保存到 SD 卡中,效果很好。但是使用相同的代码创建新项目后,它不断给出“Permission Denied”错误和IO异常。

从demo项目复制xml和gradle文件,只删除了几个activity,权限在xml文件中说明

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

也在代码中动态请求

public class PermissionManager {
    private static final int REQUEST_CODE_ASK_PERMISSIONS = 1;
    private static final String[] PERMISSIONS_ARRAYS = new String[] {
            Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};
    private static List<String> permissionsList = new ArrayList<>();
    private PermissionManager() {
    }
    public static void onResume(final Activity activity) {
        boolean isHasPermission = true;
        for (String permission : PERMISSIONS_ARRAYS) {
            if (ContextCompat.checkSelfPermission(activity,permission) != PackageManager.PERMISSION_GRANTED) {
                isHasPermission = false;
                break;
            }
        }
        if (!isHasPermission) {
            for (String permission : PERMISSIONS_ARRAYS) {
                if (ContextCompat.checkSelfPermission(activity,permission) != PackageManager.PERMISSION_GRANTED) {
                    permissionsList.add(permission);
                }
            }
            ActivityCompat.requestPermissions(activity,permissionsList.toArray(new String[permissionsList.size()]),REQUEST_CODE_ASK_PERMISSIONS);
        }
    }

我发现这个问题有几个问题,但如上所示,权限请求和声明都设置好了,它们在旧项目中运行良好,谁能给一些提示

解决方法

当您处理媒体文件并可能导致您的问题时,在 Android 10+ 上运行的设备有一项新功能。对于 Android 10,您可以通过将此行添加到 manitest 文件来临时选择退出范围存储:

 <application android:requestLegacyExternalStorage="true" ... >

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...