提问人:Nuno V. 提问时间:2/24/2018 更新时间:11/18/2023 访问量:384
从树 URI 中检索存储卷信息
Retrieving storage volume info from tree URI
问:
我正在将一个应用程序改编为 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)都不可用。
答:
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>”后缀是可选的。
评论
ACTION_OPEN_DOCUMENT_TREE
Uri
getExternalFilesDirs()
DocumentsContract.Document.MIME_TYPE_DIR