java - 在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)
解决方案
所以你的加密只是反转文件的所有字节?
为此,您不需要 RandomAccessFile,尤其是因为您将所有字节(完整文件)加载到 bytearray 中。
您也可以使用 saf uri 加载字节数组中的所有字节。然后将它们反转,然后将字节数组写回 saf uri。
您没有告诉我们的是您将一个不错的 saf uri 转换为文件路径。不要做这种下流和肮脏的事情。没有必要。使用 uri!
自 Android 4 KitKat 以来,可移动 micro sd 卡只能使用经典文件方式读取。
只有使用 SAF,您才有写入权限。(不完全正确。在 Android 11 设备上,如果您获得“所有文件访问权限”,则您拥有经典文件写入访问权限。)
推荐阅读
- vue.js - 我可以在 Vue data() 函数中创建新对象吗?
- python-3.x - python行用一个元素划分
- node.js - 如何从另一条路线调用一个模型
- sql - 将具有两个不同日期的数据分组并取最新日期
- javascript - nodejs 按文件类型计算文件大小
- rust - 仅匹配有效的 UTF-8 字符
- javascript - 如何检查 discord.js 中是否存在消息
- javascript - Angular 8 - 在单词出现时动态插入带有回调调用的按钮
- exception - 使用 Apache Camel 处理 onException() 异常
- android - 如何从 Rest API 获取动态数据