位于非主要存储卷上的com.android.externalstorage.documents Uri

4

我有一个问题。我有一个类似这样的Uri

content://com.android.externalstorage.documents/document/[volume_uuid]:[file_path]

我可以通过StorageManager.getStorageVolumes()找到StorageVolume
如果卷是主卷:StorageVolume.isPrimary() - 我可以解析路径:
Environment.getExternalStorageDirectory() + "/" + file_path;

但如果卷不是主卷,如何定位路径呢?最终我需要通过绝对路径引用纯文本文件对象。

P.S. 我肯定有所有必要的权限:无论是静态声明的权限还是运行时的权限。

1个回答

2
我明白我可以解析路径作为
不可靠。您假设代码的特定内部实现可能因设备制造商和操作系统版本而异。
最终我需要通过其绝对路径引用普通文件对象。
步骤1:使用ContentResolver和openInputStream()获取标识Uri的内容上的InputStream
步骤2:在某个您控制的文件上打开FileOutputStream(例如,在getCacheDir()中)
步骤3:将内容从InputStream复制到FileOutputStream
步骤4:在不再需要时使用生成的文件,并删除它
肯定我拥有所有必要的权限
您肯定没有,因为您无权访问可移动存储器上的文件,除非是非常特定的位置(例如,由getExternalFilesDirs()返回的第二个及后续路径)。

好的,明白了。我可以用DocumentFile来完成同样的目的吗? - Barmaley
@barmaley:DocumentFile本身不会执行任何这些步骤。此外,DocumentFile只能用于存储访问框架(例如ACTION_OPEN_DOCUMENT)中的Uri值,我不确定您从哪里获取了该Uri。但是,如果您认为它有帮助,可以尝试使用它来处理其他事情。 - CommonsWare
准确地说 - 在我的情况下,我正在处理由ACTION_OPEN_DOCUMENTACTION_OPEN_DOCUMENT_TREE返回的URI。 - Barmaley
1
@barmaley:欢迎您将它们包装在“DocumentFile”中。 - CommonsWare

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