![](/img/trans.png)
[英]Open file from specific folder with Intent.ACTION_OPEN_DOCUMENT
[英]IOException EBADF (Bad file descriptor) when reading large text files using Intent.ACTION_OPEN_DOCUMENT in Release APK
在我的Android应用程序中,我提供了一个菜单,用于通过Intent.ACTION_OPEN_DOCUMENT导入文本文件(它包含一些稍后将使用gson处理的Json数据)。 这些文件可能很大,5 MB或更大。
问题:当我直接从手机上的Android Studio启动应用程序时,一切都正常,也适用于大文件。 但是对于发行版apk,如果文件大于500kb(异常由readLine引发),我将获得IOException EBADF(错误文件描述符)。 如果我从Google驱动器或下载文件中读取文件,情况就是如此。
我使用以下方法(从我的Activity中调用)读取了代码:
private void importCollection() {
// Fetch text file
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/*");
startActivityForResult(intent, IMPORT_COLLECTION_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
if (requestCode == IMPORT_COLLECTION_CODE) {
// Fetch elements
Uri uri = data.getData();
StringBuilder sb = new StringBuilder();
BufferedReader bufferedReader = null;
try {
ParcelFileDescriptor pfd = getContentResolver().
openFileDescriptor(uri, "r");
BufferedReader bufferedReader =
new BufferedReader(new FileReader(pfd.getFileDescriptor()));
String line;
while((line = bufferedReader.readLine()) != null) { // <-- Exception here
sb.append(line);
sb.append("\n");
}
// ... do something with sb
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(bufferedReader != null) {
bufferedReader.close();
}
} catch(IOException e) {
// ignore
}
}
}
}
}
我还尝试将读取文件的代码放入AsyncTask中(无论如何是个好主意),并将FileReader直接传递给gson的fromJson方法,但是我仍然遇到相同的错误。
在StackOverflow上报告了一些类似的案例,在这些案例中,人们在读取更多数据之前不小心关闭了阅读器,但是我的代码中不是这种情况。
我的明显问题是:是否有人知道为什么会发生这种情况和/或解决方法?
greenapps在评论中回答了我的问题: 在官方文档之后,我应该使用InputStream:
InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader reader = new BufferedReader(new InputStreamReader(
inputStream));
然后就可以正常工作了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.