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中使用。