我正在使用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,将其保存到SharedPreferences
并服用Persisting Permission
。问题是我无法将SDCard
的URI与USBStorage
的URI区分开。它还适用于从Storage Access Framework
返回的URI。我怎么能真正知道用户确实选择了预期的存储而不是错误的存储。
尝试了
- 我试图用
createAccessIntent
发送一些数据,但不是能够在onActivityResult
中检索值。只是想知道这就是为什么它没有我放在Intent
返回的CC_12的附加功能。 - 我尝试使用
context.getExternalFilesDirs(null)[]
,但它返回SDCard
项目的null
。我还检查了安装的SDCard
状态。显然,我从用户获得了存储的运行时间。 - 试图假设
storageManager.getStorageVolumes()
首先将返回所有外部存储的列表,即USBStorage
的顺序,就像在我的设备上一样,但并非在所有设备上。它随机列出项目。 - 我还试图使用诸如
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,该部分是微不足道的。