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

gun*_*ess 5 android android-contentresolver

我正在从图库中选择图像,并通过ContentResolverAPI 查询其大小,它返回29kb。

但是,当我使用adb通过adb检查文件时,文件大小ls -al为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
}
Run Code Online (Sandbox Code Playgroud)

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

这是文件浏览器中的图像:

摘要

细节

另一个注意事项,每次在带有Android 26-Oreo模拟器的模拟器上使用相机应用程序时,上述情况都可以重现,但是对于Android 25-Nougat模拟器也可以。

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

小智 6

我有类似的问题。ContentResolver 低估了真实文件大小约 400 字节。我使用与如何正确获取 android.net.Uri 的文件大小?中解释的类似方法解决了这个问题。:

ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(imageUri, "r");
fileLength = pfd.getStatSize();
pfd.close();
Run Code Online (Sandbox Code Playgroud)


Dut*_*n18 -1

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

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

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