所以,我正在尝试加载一个简单的 .txt 文件,如下所示:
当然,像这样捕获结果:
它在genymotion上运行良好,并且在我使用已安装的文件浏览器(File explorer,参见上图)时,在我的设备上也很好用。但是,如果像这样直接使用选择器:
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上运行良好,并且在我使用已安装的文件浏览器(File explorer,参见上图)时,在我的设备上也很好用。但是,如果像这样直接使用选择器:
它会显示找不到指定的文件。(FileNotFoundException)
现在,我意识到从这两个文件选择器获得的URI是不同的。
content://com.android.externalstorage.documents/document/primary%3ADownload%2Ffile.txt <- 这个不起作用(Android内置浏览器)
content://media/external/file/44751 <- 这个可以用(自定义浏览器)
有没有人知道为什么我获取了相同文件的不同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();
}
}
}
仍然没有好运气 :(