访问 /storage需要哪些权限?

移动开发 2026-07-09

我已经申请成为一个 外部存储管理器,并为 true 获得

Environment.isExternalStorageManager()

然而,当尝试读取 /storage(例如 Environment.getStorageDirectory())时,我什么也读不到,而 File("/storage").canRead() 返回 false

这是为什么?我需要请求哪种权限来读取 /storage

解决方案

对于原始问题,即读取 /storage 本身,我没有找到解决办法。不过,我发现SD卡是在 /storage 下按其卷标标识挂载的。并且可以访问 /storage/<volume-id> 的内容。仍然存在确定SD卡的卷标标识的问题。

StorageManagers storageVolumes 方法会列出所有卷标,卷标标识可以从那里获得:

fun removableStorage(context: Context): List<FileItem> {
    val result = mutableListOf<FileItem>()
    val storageManager = context.getSystemService(STORAGE_SERVICE) as StorageManager
    for (volume in storageManager.storageVolumes.drop(1)) {
        result.add(
            FileItem(
                volume.getDescription(context),
                Icons.Default.SdCard,
                File(Environment.getStorageDirectory().path + "/" + volume.mediaStoreVolumeName?.uppercase())
            )
        )
    }
    return result
}

StorageVolume.mediaStoreVolumeName() 包含所需的卷标标识,但不幸的是是小写字母。要定位到SD卡,需要把它们转换成大写。所有这一切似乎被刻意设计得尽可能不友好。

前面提到的 storageVolumes 的第一项指的是内部存储。这个信息没有用,因此被省略。

StorageVolume.getDescription() 包含要呈现给用户的卷标。这就是用户在将SD卡挂载到电脑上时看到的标签。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章