gpt4 book ai didi

java - 在 Intent.ACTION_OPEN_DOCUMENT_TREE 返回的目录中创建新文件

转载 作者:行者123 更新时间:2023-12-03 16:21:45 27 4
gpt4 key购买 nike

在我的应用程序中,用户可以使用隐式 Intent ACTION_OPEN_DOCUMENT_TREE 选择创建 Excel 文件的目录。
然而,Uri 在 onActivityResult() 中返回。 FileOutputStream() 不能使用.它抛出一个 FileNotFoundException :

java.io.FileNotFoundException: content:/com.android.externalstorage.documents/tree/home%3A:test.xlsx (No such file or directory)

onActivityResult()我通过 File.exists() 检查路径是否存在如果没有,我想创建一个新的 Excel 文件。

onActivityResult():
    @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);
}
}
}

createNewExcelFile():
    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),代码可以正常工作或类似的东西,而不是隐含的 Intent 路径。

最佳答案

第 1 步:获取 Uri您从 ACTION_OPEN_DOCUMENT_TREE 获得和 pass it to DocumentFile.fromTreeUri() .

第 2 步:调用 createFile() on that DocumentFile 获取 DocumentFile代表子文档。

第 3 步:调用 getUri() on the DocumentFile 您在步骤 #2 中创建的。

第 4 步:调用 openOutputStream() on a ContentResolver ,传入Uri从第 3 步开始,获取 OutputStream可用于编写内容。你会得到一个 ContentResolver调用 getContentResolver()在一些 Context ,例如 Activity .

this blog post更多关于使用 ACTION_OPEN_DOCUMENT_TREE .

关于java - 在 Intent.ACTION_OPEN_DOCUMENT_TREE 返回的目录中创建新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61118918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com