将SDCARD URI与SAF或Storagevolume API返回的USBSTOREWORE URI区分开



我正在使用StorageVolume API来检索SDCardUSBStorage的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,将其保存到SharedPreferences并服用Persisting Permission。问题是我无法将SDCard的URI与USBStorage的URI区分开。它还适用于从Storage Access Framework返回的URI。我怎么能真正知道用户确实选择了预期的存储而不是错误的存储。

尝试了

  1. 我试图用createAccessIntent发送一些数据,但不是能够在onActivityResult中检索值。只是想知道这就是为什么它没有我放在Intent返回的CC_12的附加功能。
  2. 我尝试使用context.getExternalFilesDirs(null)[],但它返回SDCard项目的null。我还检查了安装的SDCard状态。显然,我从用户获得了存储的运行时间。
  3. 试图假设storageManager.getStorageVolumes()首先将返回所有外部存储的列表,即USBStorage的顺序,就像在我的设备上一样,但并非在所有设备上。它随机列出项目。
  4. 我还试图使用诸如Environment.getRootDirectory()之类的黑客,并获取其父并导航到根文件夹上的SDCard,但它仅返回SDCard的坐骑点的子元素和Marshmellow上的USBStorage的子元素。我的意思是它只是在Nougat 设备上返回NULL。

我已经创建了一种似乎可以为此起作用的方法。它读取 proc/mounts逐条线路线,直到找到包含提供的StorageVolume的UUID和字符串/dev/block/vold/public:179的文件。在我的测试中,/dev/block/vold/public:179似乎表示SD卡,而/dev/block/vold/public:8表示USB驱动器。

我对Linux一无所知,所以我很好奇是否有人可以确认或否认这一点的真实性。但是它可以在我的所有6个具有SD卡插槽的设备上工作。

https://gist.github.com/gavingt/2eb239d5df4e56290c1c65f25b8db8b8bf

至于从URI获取UUID,该部分是微不足道的。

相关内容

  • 没有找到相关文章

最新更新