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

Ren*_*ies 6 java android

在我的应用程序中,用户可以使用隐式意图 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)
Run Code Online (Sandbox Code Playgroud)

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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我使用Activity.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)或类似的东西而不是隐式意图路径,代码工作得很好。

Com*_*are 8

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

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

第3步:呼叫getUri()DocumentFile您在第2步创建的。

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

这个博客帖子的更多使用ACTION_OPEN_DOCUMENT_TREE