java - 如何读写SD卡?
问题描述
我有一个可以从外部 SD 卡打开和编辑二进制文件的应用程序。我希望有可能将此文件从打开的位置保存回来。
我在清单文件中添加了权限,并且我还要求用户许可。由于这些权限,我可以打开文件并获取数据,但是当我想将文件保存到外部 SD 卡时出现错误:java.io.FileNotFoundException: /storage/3834-3433/file.bin: open failed: EACCES (Permission denied)
.
这是授予权限的代码:
public boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
return true;
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
}
else {
return true;
}
}
下面是选择和获取文件路径的代码:
button.setOnClickListener(v -> {
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
startActivityForResult(intent, 200);
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 200:
if (resultCode == RESULT_OK) {
String filePath = Objects.requireNonNull(data.getData()).getPath();
filePathMain = filePath;
}
break;
}
}
这是保存文件的代码部分:
void byteArrayToFile() {
try (OutputStream out = new FileOutputStream(filePathMain)) {
out.write(outBytes);
} catch (IOException e) {
e.printStackTrace();
}
}
我不知道为什么它允许我打开文件但不能在我有<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
. 我还必须在真实设备上运行这个应用程序,因为当我在模拟器上运行它时,会出现一个错误,它找不到我选择的文件。我真的可以在这方面使用一些帮助。谢谢你。
解决方案
根据@CommonsWare 评论,我从 更改ACTION_GET_CONTENT
为ACTION_OPEN_DOCUMENT
获得file
Uri
. 还用于ContentResolver
阅读:
InputStream inputStream = getContentResolver().openInputStream(uri);
并写入文件:
ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "w");
FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
现在它工作正常。
推荐阅读
- python - 转置 Pandas 数据框保留索引
- r - 非零退出状态 tidyverse 安装包 Rstudio
- r - 在某些条件下从上面的值中减去值 - 没有循环
- python - 如何查找图像中每个多边形中的总点数
- autodesk-forge - 为什么我的 Forge 设计自动化活动 iLogic 失败?
- jquery - 用于选项卡可访问菜单的菜单可见性和 MS Edge hack
- authentication - 如何使用 OIDC 请求刷新令牌
- c - 使用 MSVC 命令行创建动态库
- python - 从 csv 文件中获取一些数字的平均值作为输入,并将平均值写入 python 3 中的输出 csv 文件
- python - 有条件地将多个列分配给另一个 DataFrame(条件确定分配该行中的哪一组列)