从树 URI 中检索存储卷信息

Retrieving storage volume info from tree URI

提问人:Nuno V. 提问时间:2/24/2018 更新时间:11/18/2023 访问量:384

问:

我正在将一个应用程序改编为 Android,它允许备份到外部存储(USB 笔式驱动器)。

我目前正在使用 Intent.ACTION_OPEN_DOCUMENT_TREE 将树 Uri 获取到所选提供程序。

public void chooseDrive(View view) {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);

    startActivityForResult(intent, READ_REQUEST_CODE);
}

我得到 URI,可以创建文件等,但我需要的是某种以编程方式识别所选提供商的方法,或者换句话说,我想要 USB 设备/存储卷的信息,如选择窗口中显示的那样,如描述和大小。

我应该提到最小的 API 是 19,因此许多 TreeUri 方法(如 DocumentFile.fromTreeUri 或 DocumentsContract.buildDocumentUriUsingTree)都不可用。

Android 存储访问框架

评论

0赞 CommonsWare 2/24/2018
“我应该提到最小 API 是 19”——在 API 级别 19 上不存在。该操作是在 API 级别 21 中添加的。API 级别 19 没有树选项,只有文档选项。“我想要 USB 设备/存储卷的信息,如选择窗口中显示的信息,例如描述和大小”——我不相信有办法得到它。ACTION_OPEN_DOCUMENT_TREEUri
0赞 Nuno V. 2/24/2018
我的错,我错过了那个细节。Api 的 19 和 20 的解决方案是什么?ACTION_OPEN_DOCUMENT MIME 类型的 dir?
0赞 CommonsWare 2/24/2018
“Api 的 19 和 20 的解决方案是什么?”——坚持使用(注意复数),其中第二个和后续条目指向您可以使用的可移动存储上的专用位置。请注意,API 级别 20 仅适用于第一代 Android Wear 设备,因此对您来说可能无关紧要。“ACTION_OPEN_DOCUMENT with mime-type dir?”——没有“dir”MIME 类型。getExternalFilesDirs()
1赞 greenapps 2/24/2018
其实有:@CommonsWare。用于创建目录。从未用ACTION_OPEN_DOCUMENT尝试过。DocumentsContract.Document.MIME_TYPE_DIR
1赞 Nuno V. 2/26/2018
就我而言,是 Wintec IDT800。我会试一试ACTION_OPEN_DOCUMENT,看看它是否能成功。尽管如此,我对音量信息也有同样的问题。我可以通过挂载服务的getVolumeList方法获取挂载卷的列表,但与ACTION_OPEN_DOCUMENT没有直接关系,我不知道我是否可以相信卷的Uid与SAF的选取器返回的URI之间的明显关系。

答:

0赞 Dustin 11/18/2023 #1
StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
String treeDocumentId = DocumentsContract.getTreeDocumentId(treeUri);
Uri documentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, treeDocumentId);
Uri mediaUri = MediaStore.getMediaUri(context, documentUri );
StorageVolume storageVolume = storageManager.getStorageVolume(mediaUri);

这太微不足道了,我简直不敢相信你问了。:P

所以,我知道这是一个令人费解的混乱,它需要 API 29。我觉得一定有一种更简单的方法,但这是我唯一能弄清楚的事情。

如果不能依赖 API 29,可以解析 treeDocumentId。对于设备存储,它是“primary:<dir>”。对于其他所有内容,它是“<UUID>:<dir>”,UUID 应该等于 StorageVolume.getUUID()。这是观察性的,API 不能保证。此外,“:<dir>”后缀是可选的。