如何获取Android设备USB OTG连接U盘的可用空间?
可行解决方案
方案1:SAF结合DocumentFile获取
若已通过SAF的ACTION_OPEN_DOCUMENT_TREE获取U盘的treeUri,可通过DocumentFile直接获取根目录的空间信息:
// 确保已获取SAF访问权限 val rootDoc = DocumentFile.fromTreeUri(context, treeUri) val freeSpace = rootDoc?.usableSpace ?: 0L val totalSpace = rootDoc?.totalSpace ?: 0L
此方法无需处理复杂的挂载路径,依赖SAF的权限即可直接获取数据。
方案2:使用StorageStatsManager(Android 8.0+)
Android 8.0(API 26)及以上版本,可利用StorageStatsManager结合U盘的uuid获取空间数据:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val storageStatsManager = context.getSystemService(Context.STORAGE_STATS_SERVICE) as StorageStatsManager try { val uuid = volume.uuid?.let { UUID.fromString(it) } uuid?.let { val stats = storageStatsManager.getStatsForUuid(it) val freeSpace = stats.freeBytes val totalSpace = stats.totalBytes } } catch (e: Exception) { // 处理UUID格式错误、权限不足等异常 } }
注意:需申请READ_EXTERNAL_STORAGE权限,Android 10+还需额外权限或通过SAF获取访问授权。
方案3:获取授权后的可访问路径
U盘的/mnt/media_rw/xxx是系统私有挂载路径,普通应用无访问权限。需先获取存储卷的访问授权,再使用可访问路径:
- 申请存储卷访问权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val intent = volume.createAccessIntent(null) startActivityForResult(intent, REQUEST_USB_ACCESS) }
- 授权成功后,通过
volume.directory获取可访问路径,再用StatFs或File.usableSpace:
val accessibleDir = volume.directory if (accessibleDir?.exists() == true) { val statFs = StatFs(accessibleDir.absolutePath) val freeSpace = statFs.availableBlocksLong * statFs.blockSizeLong // 或直接用File的方法 val freeSpaceAlt = accessibleDir.usableSpace }
说明
Android原生支持获取U盘可用空间,核心问题在于权限和路径的正确处理:
- 普通应用无法直接访问系统私有挂载路径,必须获取对应存储卷的访问授权。
- 不同Android版本的权限机制有差异,需针对性适配。
内容的提问来源于stack exchange,提问作者user924
相关产品推荐
相关产品推荐

