You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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是系统私有挂载路径,普通应用无访问权限。需先获取存储卷的访问授权,再使用可访问路径:

  1. 申请存储卷访问权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    val intent = volume.createAccessIntent(null)
    startActivityForResult(intent, REQUEST_USB_ACCESS)
}
  1. 授权成功后,通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:36:18