【问题标题】:Content resolver returns wrong size内容解析器返回错误的大小
【发布时间】:2018-01-17 14:02:31
【问题描述】:

我正在从图库中挑选一张图片并通过ContentResolver API 查询其大小,它返回 29kb。

但是,当我使用 ls -al 通过 adb 检查文件时,它是 44kb

这是我查询图像大小的方法:

    private fun getFileInfo(contentResolver: ContentResolver, fileUri: Uri): Pair<String, Long>? {
    val projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.SIZE)
    val metaCursor = contentResolver.query(fileUri, projection, null, null, null)
        metaCursor?.use {
            if (it.moveToFirst()) {
                val displayNameIndex = it.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)
                val sizeIndex = it.getColumnIndex(MediaStore.MediaColumns.SIZE)
                return Pair(it.getString(displayNameIndex), it.getLong(sizeIndex))
            }
    }
    return null
}

我正在使用奥利奥模拟器。 我还通过模拟器的工具进行了检查,文件浏览器显示为 29kb,另一方面文件详细信息显示为 45kb。 怎么回事?

以下是来自文件浏览器的图片:

另一方面,在带有 Android 26-Oreo 模拟器的模拟器上使用相机应用程序时,上述情况每次都可以重现,但在模拟器 Android 25-Nougat 上则可以。

我检查过了,新的Document API 也返回 29kb

【问题讨论】:

  • 您是否尝试强制媒体存储重新扫描?可能大小已更改,但未在数据库中更新
  • @Selvin 是 Google API 模拟器,所以无法运行 root 命令,但重启了模拟器。
  • 根命令?我很确定Intent.ACTION_MEDIA_SCANNER_SCAN_FILE 不需要root
  • @Selvin 你的评论我试过了,没有帮助。
  • 不是因为一个是文件的真实大小,一个是文件在存储上占用的空间吗?

标签: android android-contentresolver


【解决方案1】:

我遇到了类似的问题。 ContentResolver 将真实文件大小低估了大约 400 字节。我使用与How to correctly get the file size of an android.net.Uri? 中解释的类似方法解决了它:

ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(imageUri, "r");
fileLength = pfd.getStatSize();
pfd.close();

【讨论】:

  • 我不建议在循环中使用它。当我在一个包含 10000 个对象的循环中使用这个函数时,它会导致大约 10-20 秒的延迟。
【解决方案2】:

Android 8.0 (Oreo) 引入了“SDCardFS”文件系统,它取代了 /sdcard 分区上的“FUSE”。

这个新文件系统有可能具有较大的集群大小,因此无法准确分配 29kb,而是分配大于 29kb 的最小块,在您的情况下为 44.*kb。

ls -al 和文件详细信息的差异可能是由于舍入不同造成的。

【讨论】:

  • 我怀疑是不是这样。我拍了几张照片;当图像显示 35kb 时,详细信息在同一模拟器上显示为 53kb。附带说明,8.1 Emulator 也返回不同的值,但是差异要小得多。
  • @guness,这只发生在图片上吗?你尝试过不同的图像格式吗?编辑:有时文件系统在文件缩小后不会释放空间,导致碎片,如果你已经编辑了一堆文件,这也可能是这种情况。
  • 视频似乎还不错,而且我从未编辑过图像。最后,相机仅以一种格式拍摄图像:jpg 编辑:我相信这与以下问题有关:stackoverflow.com/questions/21882322/…
猜你喜欢
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多