如何从OPEN_DOCUMENT意图获取文件系统路径?

时间:2016-02-11 13:43:15

标签: android android-intent android-6.0-marshmallow filechooser

我正在构建一个Android应用程序,我必须从运行Android Marshmallow(API v23)的Motorola G 2015手机的Downloads文件夹中读取文件。

为实现这一目标,我想通过OPEN_DOCUMENTGET_CONTENT意图选择该文件,以利用用户手机上的现有文件浏览器,而不是实现自己的文件浏览器。

我的清单声明:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

我试图从这样的意图中接收结果:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case action_choose_file:
            Intent chooseFile;
            Intent intent;
            chooseFile = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            chooseFile.setType("application/epub+zip");
            intent = Intent.createChooser(chooseFile, "Choose a file");
            startActivityForResult(intent, ACTIVITY_CHOOSE_FILE);
            return true;
        .....
    }
}

要处理结果,我会这样做:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case ACTIVITY_CHOOSE_FILE: {
            if (resultCode == RESULT_OK) {
                Uri uri = data.getData();
                String filePath = uri.getPath();
                final InputStream in = new FileInputStream(filePath);
            }
            break;
    ....
    }
}

但是new FileInputStream失败并显示ENOENT - 文件不存在异常,并且日志记录filePath显示它的值类似于/documents/2055而不是真正的文件路径。< / p>

我怀疑我需要查询DocumentProvider之类的东西,但我找不到类似于我的案例。 值得一提的是,几年前我的代码过去常常像这样工作,所以我怀疑android处理文件访问的方式发生了一些变化。

如何从我的Android手机的Downloads位置访问文件?

1 个答案:

答案 0 :(得分:2)

  

如何从OPEN_DOCUMENT意图中获取文件系统路径?

你不是。不要求存在<MenuButton fx:id="menu" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" prefHeight="34.0" prefWidth="35.0" style="-fx-background-color: #6600ff; -fx-border-width: 0; -fx-mark-color: white; -fx-padding: 5;" textAlignment="CENTER" textFill="WHITE" underline="true"> <items> <MenuItem fx:id="newSearch" mnemonicParsing="false" text="New Search" onAction="#clearSearch" /> <SeparatorMenuItem /> <MenuItem fx:id="saveSearch" mnemonicParsing="false" text="Save Search" onAction="#saveSearch" /> <MenuItem fx:id="loadSearch" mnemonicParsing="false" text="Load Search" /> <SeparatorMenuItem /> <MenuItem fx:id="saveResults" mnemonicParsing="false" text="Save Results" /> <MenuItem fx:id="loadResults" mnemonicParsing="false" text="Load Results" /> <SeparatorMenuItem /> <MenuItem fx:id="exportResults" mnemonicParsing="false" text="Export Results" /> </items> <font> <Font name="Arial" size="12.0" /> </font> </MenuButton> 的文件,更不用说可以访问的文件了。

  

然而,新的FileInputStream失败,ENOENT文件不存在异常,并且日志记录文件路径显示它的值类似于/ documents / 2055而不是真正的文件路径。

使用UriContentResolver和/或openInputStream()获取由openOutputStream()代表的数据的流。

  

如何从我的Android手机的下载位置访问文件?

使用an existing file-browsing library,或编写自己的文件浏览UI。存储访问框架(Uri和亲属)用于允许用户选择用户选择存储它的内容,无论是否存在ACTION_OPEN_DOCUMENT目录,Google云端硬盘或Dropbox,或其他任何地方。