Android 区分SD卡URI与SAF或StorageVolume API返回的USB存储URI
我正在使用Android 区分SD卡URI与SAF或StorageVolume API返回的USB存储URI,android,android-sdcard,android-external-storage,usb-otg,storage-access-framework,Android,Android Sdcard,Android External Storage,Usb Otg,Storage Access Framework,我正在使用StorageVolumeAPI检索SDCard和USBStorage的URI,方法如下 StorageManager storageManager = (StorageManager) getSystemService(STORAGE_SERVICE); for (StorageVolume storageVolume : storageManager.getStorageVolumes()) { if (!storageVolume.isPrimary())
StorageVolume
API检索SDCard
和USBStorage
的URI,方法如下
StorageManager storageManager = (StorageManager) getSystemService(STORAGE_SERVICE);
for (StorageVolume storageVolume : storageManager.getStorageVolumes())
{
if (!storageVolume.isPrimary())
{
Intent accessIntent = storageVolume.createAccessIntent(null);
startActivityForResult(accessIntent, 11);
}
}
在onActivityResult
中,我可以检索URI,将其保存到SharedReferences
并获取持久化权限。问题是我无法区分SDCard
的URI和USBStorage
的URI。它还适用于从存储访问框架返回的URI。我怎么知道用户确实选择了预期的存储而不是错误的存储呢
尝试过的事情
我试图用createAccessIntent
发送一些数据,但没有成功
能够在ActivityResult中检索值。我只是想知道
这就是为什么它没有我放在createAccessIntent
返回的Intent
中的额外内容
我试图context.getExternalFilesDirs(null)[
但它为SDCard
项返回null
。我还检查了已安装的SDCard
的状态。显然,我从用户那里获得了存储的运行时权限
尝试假设storageManager.getStorageVolumes()
将首先返回所有外部存储的列表,其顺序为USBStorage
,就像它在我的设备上一样,但不是在所有设备上一样。它随机列出项目
我还尝试使用类似于Environment.getRootDirectory()
的hack方法,获取其父目录并导航到根文件夹上的SDCard
,但它只返回SDCard
和USBStorage
上的挂载点的子元素。我的意思是,它只是在Nougat
+设备上返回null李>
不幸的是,API似乎是专门为阻止您尝试执行的操作而设计的。顺便问一下,你为什么特别要求SD卡和USB存储?如果用户尝试选择内部硬盘驱动器(例如Chromebook上的硬盘驱动器),该怎么办?投递箱?古德尔驱动器文件夹?也许你不应该试图区分精确的存储类型,而是检查你关心的特定属性?@user1643723我不这么认为。我的意思是,我甚至不能向用户显示他们选择了什么?我的意思是,他们可能错误地选择了所需的内容并希望进行更改。@user1643723我尝试这样做的原因是,如果用户同时连接了SD卡和USB驱动器,我可以为“您想在哪里存储数据”用户界面提供可理解的名称。在只有一个可移动存储选项的情况下,“内部”和“可移动”将起作用。如果它们由于某种原因都已连接,“Removable 1”和“Removable 2”不会给出哪个是哪个的指示。StorageVolume实例有很多属性。还有一个名称/说明/信息属性。它们可用于让用户选择。但是如果你想要驱动器,那么它总是最后一个。您可以保存该数据并在onActivityResult中使用。