所以,我试图像这样加载一个简单的.txt文件:
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("text/plain");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a File to Upload"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
}
当然,抓住这样的结果:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
如果我使用我安装的文件浏览器(文件浏览器,请参见上图),它在genymotion和我的设备上效果很好,现在,如果直接使用选择器:
它说无法找到指定的文件。 (FileNotFoundException异常)
现在,我已经意识到我从这两个文件选择器获得的URI是不同的
内容://com.android.externalstorage.documents/document/primary%3ADownload%2Ffile.txt< - 这个没有工作(android内置于资源管理器中)
content:// media / external / file / 44751< - 这个工作(自定义资源管理器)
有没有人知道为什么我为SAME文件获取不同的URI。
修改 我尝试使用内容解析器从URI获取文件路径,如下所示:
public class Utils {
public static String getRealPathFromURI(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = {MediaStore.Files.FileColumns.DATA};
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(proj[0]);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}
仍然没有运气:(
答案 0 :(得分:1)
@ CommonsWare的asnwer必须是解决这个问题的正确方法,但我不确定如何实施他的解决方案。 我最终做了@Paul Burke在这个链接上的建议:
Android Gallery on KitKat returns different Uri for Intent.ACTION_GET_CONTENT
修改强>
就我的具体情况而言,这就是我的代码结束的方式。我把它留在这里以备将来参考。 (我正在使用@ CommonsWare的解释)看到他上面的答案。
try {
InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader br = null;
if (inputStream != null) {
br = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = br.readLine()) != null) {
text.append(line);
text.append("\n");
}
} else {
subscriber.onError(new InputException("There's something seriously wrong with this file"));
}
} catch (IOException e) {
e.printStackTrace();
subscriber.onError(e);
}
答案 1 :(得分:0)
我尝试使用内容解析器从URI中获取文件路径
没有文件路径。您可以在本地文件系统上访问的A Uri
does not necessarily point to a file,就像此网页的URL不一定指向您可以在本地文件系统上访问的文件一样。 Uri
可能:
使用ContentResolver
和openInputStream()
等方法来读取Uri
所代表的内容,就像使用HttpUrlConnection
读取由openInputStream()
所代表的内容一样此网页的URL。 Uri
将InputStream
作为参数并返回InputStream
。您可以像使用其他任何InputStream
一样使用FileInputStream
InputStream
(例如,来自HttpUrlConnection
的{{1}},BitmapFactory
。其确切的机制将在很大程度上取决于基础数据(例如read in a string,传递给Bitmap
以解码{{1}}。)