我正在构建一个Android应用程序,我必须从运行Android Marshmallow(API v23)的Motorola G 2015手机的Downloads
文件夹中读取文件。
为实现这一目标,我想通过OPEN_DOCUMENT
或GET_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
位置访问文件?
答案 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而不是真正的文件路径。
使用Uri
和ContentResolver
和/或openInputStream()
获取由openOutputStream()
代表的数据的流。
如何从我的Android手机的下载位置访问文件?
使用an existing file-browsing library,或编写自己的文件浏览UI。存储访问框架(Uri
和亲属)用于允许用户选择用户选择存储它的内容,无论是否存在ACTION_OPEN_DOCUMENT
目录,Google云端硬盘或Dropbox,或其他任何地方。