URI路径为什么在使用File时无效?

3

你好,我正在使用以下意图在安卓中选择任何文件:

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("*/*");
        startActivityForResult(intent, PICKFILE_REQUEST_CODE);

我正在为选定的文件获取Uri,并通过调用uri.getPath()方法获取文件路径。在获取路径后,我使用file = new File(new URI(filePath));创建文件对象,但我会收到IllegalArgumentException:URI不是绝对的。为什么会这样?如何获取绝对路径?是否有其他选择可以使用Intent选择任何文件,然后Uri?
在Android调试器中,uri对象显示为(来自下载):content://com.android.providers.downloads.documents/document/67;而uri.getPath()给出的是/document/67

你在选择图片吗? - Sohail Zahid
记录 filePath 的值,还有为什么要使用 File(URI) 构造函数? - pskink
好的,你想如何处理返回的 Uri - pskink
@pskink,我想要一个文件对象来处理文件,如果你有任何读取文件的替代方法,请建议。 - Prashant
1
使用 ContentResolver#openInputStream(Uri) - pskink
显示剩余2条评论
1个回答

3

返回的Uri可能具有与file://不同的方案,即它并不总是指向本地文件或对所有设备应用程序可用的文件的URI。例如,它可能是content:// URI,其路径与本地文件系统路径没有任何关系。解决此问题的公平方法是 - 测试方案是否为file://,如果不是,则通过context.getContentResolver().openInputStream(uri)打开InputStream,然后将内容复制到本地临时文件。


在调试器中,我看到方案为content://。 - Prashant
这就是为什么你不能将URI路径用作本地文件路径的原因 - 这个路径是一个抽象实体,只有在生成此URI的ContentProvider上下文中才具有某些含义。您可以使用答案中描述的解决方法。 - Sergio
所以你是在建议,如果scheme是content,我就必须这样做——>“通过context.getContentResolver().openInputStream(uri)打开InputStream,然后将内容复制到本地临时文件中。”? - Prashant
是的,就是这样。 - Sergio

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