从Uri获取文件的正确方式Android

4

我使用以下方式从本地存档中选择PDF文件:

startActivityForResult(Intent.createChooser(new Intent().setType("application/pdf").setAction(Intent.ACTION_GET_CONTENT), getString(R.string.str_select_file)), request_id_archive);

并管理结果:

    @Override
    protected void onActivityResult(int request_code, int result_code, Intent data) {
        super.onActivityResult(request_code, result_code, data);

        if (request_code == request_id_archive && result_code == RESULT_OK && data != null && data.getData() != null) {
            Uri myuri = data.getData();
            String mypath = myuri.getPath();
            File myfile = new File(mypath);
            Log.d("mylog1", uri.toString());
            Log.d("mylog2", uri.getPath());
            Log.d("mylog3", f.getPath());
            Log.d("mylog4", f.toString());
            Log.d("mylog5", Boolean.toString(f.exists()));
        }
        else {...}

似乎文件创建不成功。 我的日志结果如下:
  • mylog1 -> content://media/external/file/7406
  • mylog2 -> /external/file/7406
  • mylog3 -> /external/file/7406
  • mylog4 -> /external/file/7406
  • mylog5 -> false
为什么file.exist()方法返回文件不存在呢?
在其他代码中,我尝试对该文件进行多种操作。
...
InputStream inputStream = new FileInputStream(file);
...

但是我的应用程序崩溃了,在Logcat中我看到了以下信息:
java.io.FileNotFoundException: /document/raw:/storage/emulated/0/Download/20180702_121938.pdf (No such file or directory)

我正在Android 7上测试我的代码。

尝试这个代码:Intent intentPDF = new Intent(Intent.ACTION_GET_CONTENT); intentPDF.setType("application/pdf"); intentPDF.addCategory(Intent.CATEGORY_OPENABLE); - Hemant Parmar
Uri.getPath() 方法无法提供文件系统路径。此外,没有正确的方法可以从此类 uri 获取文件。如果您试图这样做,那么您完全走错了方向。 - greenapps
2
document/raw:/storage/emulated/0/Download/20180702_121938.pdf 不是一个有效的路径。请尝试使用 /storage/emulated/0/Download/20180702_121938.pdf - greenapps
@ greenapps,根据您的建议,我使用了substring解决了问题:uri.getPath().replace("document/raw:","")。它有效了。不过这只是一个权宜之计。正如您所说,“你完全走错了方向。”那么,从onActivityResult中获取文件的正确方法是什么? - F.M.
你不需要尝试获取一个文件。你可以直接使用URL。你不需要文件。 - greenapps
2
抱歉,我不明白你为什么说“你不需要文件”。onActivityResult只返回一个Uri。我需要一个File对象来执行我的操作... - F.M.
1个回答

5
你需要将'document/raw'替换为一个空字符串,因此在访问该文件之前需要添加此代码:
if(mypath.contains("document/raw:")){
    mypath = mypath.replace("/document/raw:","");
}

你在我调试和搜索了三个小时之后帮了我一把。 - Amr SubZero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接