Android 读写文件已授权但是无法在系统储存目录下执行文件操作

Android 读写文件已授权但是无法在系统储存目录下执行文件操作处理

问题描述

在进行Android原生开发时遇到一个问题:在AndroidMainfest.xml里已经声明了文件读写操作权限并且也在代码内部动态申请获取文件读写操作权限,但是依然无法在系统储存目录下进行文件创建、读写操作。

  1. 无法进行文件创建操作:
    fileStorageDir.exists() ===> 得到false // 文件不存在, 创建文件失败
    fileStorageDir.mkdirs() ===> 得到false // 创建文件夹失败
  2. 无法进行文件读写
    在已有的文件夹下,进行文件创建、读写操作报错: java.io.IOException: Permission denied

文件操作代码

public static boolean checkFilePath(Context ctx) {
        // 已授权
         // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
        if (ContextCompat.checkSelfPermission(ctx, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            // 文件路径不存在
            File fileStorageDir = new File(getStoragepath(ctx));
            if (filePath.equals("")) {
//                boolean canDo = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); // 外部存储是否可用
                if (!fileStorageDir.exists()) {
                    // 文件不存在
                    if (fileStorageDir.mkdirs()) {
                        // 创建文件夹
                        filePath = fileStorageDir.getPath() + File.separator + "fileName.txt";
                        Log.d("DataFileUtil", "文件地址:" + filePath);
                        return true;
                    } else {
                        Log.d("DataFileUtil", "checkFilePath: 创建文件夹失败");
                        filePath = "";
                        return false;
                    }
                } else {
                    filePath = fileStorageDir.getPath() + File.separator + "fileName.txt";
                    return true;
                }
            } else {
                filePath = fileStorageDir.getPath() + File.separator + "fileName.txt";
                Log.d("DataFileUtil", "文件地址:" + filePath);
                return true;
            }
        } else {
            // 未授权
            Log.d("DataFileUtil", "checkFilePath: 文件操作未授权");
            filePath = "";
            return false;
        }
    }

文件操作基本配置:

    <!-- 允许程序向外部存储设备读数据 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 允许程序向外部存储设备写数据 -->
    <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <!-- 文件系统权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

动态获取文件操作权限

public void checkPermissions() {
        String[] permissions = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS};
        if (Build.VERSION.SDK_INT >= 23) {
            for (int i = 0; i < permissions.length; i++) {
                int check = ContextCompat.checkSelfPermission(this, permissions[i]);
            }
        } 
    }

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

问题分析

  1. Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 外部储存可用
  2. 在已有的文件夹下,进行文件创建、读写操作报错:没有权限 ==> 在系统储存目录下执行文件操作权限不足
  3. 在系统储存目录下执行文件操作换成在APP文件目录下执行文件操作 ⇒ 可以操作 ==> 权限不足

综上:操作系统储存目录需要除普通的文件读写操作权限外,还需要配置

系统目录下文件操作配置

AndroidMainfest.xml的application 下新增配置
android:requestLegacyExternalStorage="true" 解决问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值