首页 > 解决方案 > 在SD卡中写入文件时权限被拒绝

问题描述

我正在开发一个视频播放器应用程序。它使用Storage Access Framework将一些视频下载到 sd 卡上。我成功下载了视频,但我希望在下载后对其进行加密,所以我使用以下代码:-

import java.io.RandomAccessFile;

public class VideoCrypt {
    public static final int REVERSE_BYTE_COUNT = 1024;

    public static boolean decrypt(String path) {
        try {
            if (path == null) return false;
            File source = new File(path);
            int byteToReverse = source.length() < REVERSE_BYTE_COUNT ? ((int) source.length()) : REVERSE_BYTE_COUNT;
            RandomAccessFile f = new RandomAccessFile(source, "rw");
            f.seek(0);
            byte b[] = new byte[byteToReverse];
            f.read(b);
            f.seek(0);
            reverseBytes(b);
            f.write(b);
            f.seek(0);
            b = new byte[byteToReverse];
            f.read(b);
            f.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static boolean encrypt(String path) {
        try {
            if (path == null) return false;
            File source = new File(path);
            RandomAccessFile f = new RandomAccessFile(source, "rw");
            f.seek(0);
            int byteToReverse = source.length() < REVERSE_BYTE_COUNT ? ((int) source.length()) : REVERSE_BYTE_COUNT;
            byte b[] = new byte[byteToReverse];
            f.read(b);
            f.seek(0);
            reverseBytes(b);
            f.write(b);
            f.seek(0);
            b = new byte[byteToReverse];
            f.read(b);
            f.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    private static void reverseBytes(byte[] array) {
        if (array == null) return;
        int i = 0;
        int j = array.length - 1;
        byte tmp;
        while (j > i) {
            tmp = array[j];
            array[j] = array[i];
            array[i] = tmp;
            j--;
            i++;
        }
    }

代码在内部存储上运行良好,但在 SD 卡的情况下,我收到此权限错误:

ava.io.FileNotFoundException: /storage/0C69-1809/Android/tersjwafuh/ALongWa Down.@7&259: open failed: EACCES (Permission denied)

标签: javaandroidandroid-studio

解决方案


所以你的加密只是反转文件的所有字节?

为此,您不需要 RandomAccessFile,尤其是因为您将所有字节(完整文件)加载到 bytearray 中。

您也可以使用 saf uri 加载字节数组中的所有字节。然后将它们反转,然后将字节数组写回 saf uri。

您没有告诉我们的是您将一个不错的 saf uri 转换为文件路径。不要做这种下流和肮脏的事情。没有必要。使用 uri!

自 Android 4 KitKat 以来,可移动 micro sd 卡只能使用经典文件方式读取。

只有使用 SAF,您才有写入权限。(不完全正确。在 Android 11 设备上,如果您获得“所有文件访问权限”,则您拥有经典文件写入访问权限。)


推荐阅读