1

如何从 Uri 获取完整路径,就像 /Removable/MicroSD/

我使用下面的代码让用户在 Lollipop 上选择 SD 卡以获得对 SD 卡的写入访问权限。

startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), 42);

使用以下代码创建了一个 onActivityResult 方法来处理结果

if (resultCode == RESULT_OK)
{
    Uri treeUri = resultData.getData();
    DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
    WriteDebugData(pickedDir.getName());
}

但是它返回目录为MicroSD,我需要的是完整路径名/Removable/MicroSD/

PS:我还想要所有引用 Uri 的链接,对于 Ex /Removable/MicroSD//Storage/MicroSD/两个路径都引用外部 MicroSD 卡,我如何获得它们?

4

1 回答 1

3

如何从 Uri 获取完整路径,就像 /Removable/MicroSD/

你没有。

首先,根本不需要Uri实际指向物理存储。例如,通过ACTION_OPEN_DOCUMENT_TREE(例如,Google Drive、Dropbox)访问的云服务很可能会向您返回一个Uri,在内部,它用作查找关键字到包含可用文档列表的本地缓存的数据库中。

Uri其次,即使它指向物理存储,也不要求 是物理存储上您可以访问的位置。特别是,在任何具有存储访问框架(例如ACTION_OPEN_DOCUMENT_TREE)的设备上,您都没有对可移动存储的任意访问权限。或者,对于云服务,物理存储可能是内部存储,对其应用程序来说是私有的。

第三,没有要求Uri,即使它指向您可以访问的物理存储,实际上也将该位置数据烘焙到Uri自身中。Uri可能content://some.authority.string/asdfklasj2348dfljaslkdfj是。事实上,我会建议任何开发人员创建一个ContentProvider,特别是那些支持存储访问框架的开发人员,以确保这些Uri值尽可能不透明。

IOW,aUri不是对本地文件的引用,正如Web 服务器的 URL 不是对本地文件的引用一样。

于 2015-08-16T13:32:44.653 回答