首页 > 解决方案 > 在 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)如果我使用或类似的东西而不是隐式意图路径,代码工作得很好。

标签: javaandroid

解决方案


第 1 步:获取Uri您从中获取的内容ACTION_OPEN_DOCUMENT_TREE并将其传递给DocumentFile.fromTreeUri().

步骤#2:调用createFile()DocumentFile来获取DocumentFile代表子文档。

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

第 4 步:调用openOutputStream()aContentResolverUri从第 3 步传入,以获取OutputStream可用于编写内容的 an。您可以ContentResolver通过调用getContentResolver()一些来获得 a Context,例如 a Activity

有关使用. _ACTION_OPEN_DOCUMENT_TREE


推荐阅读