java - 在 Intent.ACTION_OPEN_DOCUMENT_TREE 返回的目录中创建新文件
问题描述
在我的应用程序中,用户可以使用隐式意图 ACTION_OPEN_DOCUMENT_TREE 选择创建 Excel 文件的目录。但是,返回的 UrionActivityResult()
不能被FileOutputStream()
. 它抛出一个FileNotFoundException
:
java.io.FileNotFoundException: content:/com.android.externalstorage.documents/tree/home%3A:test.xlsx (No such file or directory)
在onActivityResult()
我检查路径是否存在时File.exists()
,如果不存在,我想创建一个新的 Excel 文件。
活动结果():
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
Log.d(TAG, "onActivityResult: called");
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == 2) {
Log.d(TAG, "onActivityResult: path = " + data.getData()
.getPath());
Uri treePath = data.getData();
File path = new File(treePath + File.pathSeparator + "test.xlsx");
if (path.exists()) {
updateExistingExcelFile(path);
} else {
createNewExcelFile(path);
}
}
}
创建新Excel文件():
private void createNewExcelFile(File path) {
Log.d(TAG, "createNewExcelFile: called");
Workbook workbook = new HSSFWorkbook();
Cell cell;
Sheet sheet;
sheet = workbook.createSheet("Name of sheet");
Row row = sheet.createRow(0);
cell = row.createCell(0);
cell.setCellValue("Name");
cell = row.createCell(1);
cell.setCellValue("Number");
sheet.setColumnWidth(0, (10 * 200));
sheet.setColumnWidth(1, (10 * 200));
FileOutputStream fileOutputStream;
try {
fileOutputStream = new FileOutputStream(path);
workbook.write(fileOutputStream);
Toast.makeText(this, "Created", Toast.LENGTH_LONG)
.show();
fileOutputStream.close();
} catch (IOException e) {
Log.e(TAG, "createNewExcelFile: ", e);
}
}
Activity.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)
如果我使用或类似的东西而不是隐式意图路径,代码工作得很好。
解决方案
第 1 步:获取Uri
您从中获取的内容ACTION_OPEN_DOCUMENT_TREE
并将其传递给DocumentFile.fromTreeUri()
.
步骤#2:调用createFile()
它DocumentFile
来获取DocumentFile
代表子文档。
步骤#3:调用您getUri()
在DocumentFile
步骤#2 中创建的。
第 4 步:调用openOutputStream()
aContentResolver
,Uri
从第 3 步传入,以获取OutputStream
可用于编写内容的 an。您可以ContentResolver
通过调用getContentResolver()
一些来获得 a Context
,例如 a Activity
。
有关使用. _ACTION_OPEN_DOCUMENT_TREE
推荐阅读
- excel - 如何根据多个单元格值自动隐藏和取消隐藏excel中的行
- python - 当我没有为其分配名称时,输入返回错误的结果
- php - 为什么我会收到 sendmail 发送的邮件副本?
- pdf - 使用 imagemagick 将 pdf 转换为 jpg 时出现字体渲染错误
- oop - lua oop 开始
- javascript - 在Javascript中将平面数据数组转换为嵌套对象
- android - 动态解析 JSON | 安卓
- android - 图像识别和数据库,我从哪里开始?
- go - 在使用 gin gonic 进行负载测试期间打开的文件过多
- java - Tomcat Sessions 存储目录