如何在 26 以下的 Android API 上使用 StorageManager 获取目录的 uuid?

Posted

技术标签:

【中文标题】如何在 26 以下的 Android API 上使用 StorageManager 获取目录的 uuid?【英文标题】:How to get directory's uuid using StorageManager on Android API below 26? 【发布时间】:2021-06-25 18:49:25 【问题描述】:

我创建了一个辅助函数来检查任何给定目录的剩余空间。

@RequiresApi(Build.VERSION_CODES.O)
fun Context.hasFreeSpace(directory: File, requiredStorageSpace: Long): Boolean
    return try 
        val storageManager = getSystemService<StorageManager>()
        val directoryUUID = storageManager!!.getUuidForPath(directory)
        val availableBytes = storageManager.getAllocatableBytes(directoryUUID)
        availableBytes > requiredStorageSpace
    catch (e: Exception)
        e.printStackTrace()
        false
    

实际点击此链接。 https://developer.android.com/training/data-storage/app-specific#query-free-space

问题是我得到 storageManager!!.getUuidForPathstorageManager.getAllocatableBytes 都需要 API >= 26。

我在谷歌上搜索过,但没有找到关于如何在 API

有人知道如何实现吗?

谢谢

【问题讨论】:

【参考方案1】:

好吧,我想我需要一种不同的方法。正如我在谷歌上搜索的那样,在 Android O 发布时添加了所需的 UUID。所以基本上,没有这样的东西会在 O 之前获得目录 UUID 退出。现在这是我的辅助函数。

@SuppressLint("NewApi")
fun Context.hasFreeSpace(directory: File, requiredStorageSpace: Long): Boolean 
    return try 
        val api = Build.VERSION.SDK_INT
        val availableBytes = when 
            api >= Build.VERSION_CODES.O -> 
                val storageManager = getSystemService<StorageManager>()
                val directoryUUID = storageManager!!.getUuidForPath(directory)
                storageManager.getAllocatableBytes(directoryUUID)
            
            else -> 
                val stat = StatFs(directory.path)
                stat.availableBlocksLong * stat.blockSizeLong
            
        
        availableBytes > requiredStorageSpace
     catch (e: Exception) 
        e.printStackTrace()
        false
    

【讨论】:

以上是关于如何在 26 以下的 Android API 上使用 StorageManager 获取目录的 uuid?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上使图像透明?

如何在 CLI 上使 gpg 提示输入密码

JobIntentService 不适用于 Oreo 以下的 API (API <= 26)

错误:仅从 Android O (--min-api 26) 开始支持调用自定义

如何从不在 Android 的 API 26 上的 WebView 获取 WebviewClient 实例?

如何在移动视图上使输入和按钮堆栈相互叠加