内容解析器返回错误的大小

时间:2018-01-17 14:02:31

标签: android android-contentresolver

我从图库中挑选图片并通过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。 发生了什么事?

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

Summary

Details

另一方面注意,上述情况每次在使用Android 26-Oreo仿真器的模拟器上使用相机应用程序时都可以重现,但是对于模拟器Android 25-Nougat来说这很好。

我已经检查过,新Document API也会返回29kb

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

Android 8.0(Oreo)推出了'SDCardFS'文件系统,取代了/ sdcard分区上的'FUSE'。

这个新文件系统可能有一个很大的簇大小,因此无法准确分配29kb,而是大于29kb的最小块,在你的情况下是44 * kb。

ls -al和文件详细信息之间的差异可能是由不同的舍入引起的。