android - MediaStore 图像宽度和高度 null

标签 android mediastore

当我爬行 MediaStore 时,有些图像的高度和体重条目为空。

文件存在,我可以使用图像浏览器显示它们。

Cursor mCursor = _context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,null,null,MediaStore.Images.Media.DEFAULT_SORT_ORDER);
if(mCursor != null){
    mCursor.moveToFirst();
    while(!mCursor.isAfterLast()) {
            Log.d("DEBUG","PIC PATH: " + mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA)));
            Log.d("DEBUG","WIDTH: " + mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.WIDTH)));
            Log.d("DEBUG","HEGHT: " + mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.HEIGHT)));
        mCursor.moveToNext();
    }
    mCursor.close();
}

09-12 18:17:30.861 13002-13002/com.google.observer D/DEBUG: PIC PATH: /storage/emulated/0/Pictures/Instagram/IMG_20160813_221335.jpg

09-12 18:17:30.861 13002-13002/com.google.observer D/DEBUG: WIDTH: null

09-12 18:17:30.861 13002-13002/com.google.observer D/DEBUG: HEGHT: null

该文件的尺寸为:3366*2988,我可以在文件浏览器中打开它。

编辑

我尝试使用列(请参阅 Pavneet Singh 的回答),但出现同样的错误。大多数图片都可以,只有少数有这个问题:

final String[] columns = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.WIDTH, MediaStore.Images.Media.HEIGHT, MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.SIZE};
Cursor mCursor = _context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,columns,null,null,MediaStore.Images.Media.DEFAULT_SORT_ORDER);
if(mCursor != null){
    mCursor.moveToFirst();
    while(!mCursor.isAfterLast()) {
            Log.d("DEBUG","PIC PATH: " + mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA)));
            Log.d("DEBUG","WIDTH: " + mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.WIDTH)));
            Log.d("DEBUG","HEGHT: " + mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.HEIGHT)));
        mCursor.moveToNext();
    }
    mCursor.close();
}

最佳答案

MediaStore 由于 docs 中提到的性能原因,不会自动返回所有列值。因此您需要显式地将投影传递给 MediaStore 查询。

final String[] columns = {
    MediaStore.Images.Media.DATA,
    MediaStore.Images.Media.WIDTH,
    MediaStore.Images.Media.HEIGHT
    };


Cursor mCursor = _context.getContentResolver().
                     query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                          columns,null,null,
                          MediaStore.Images.Media.DEFAULT_SORT_ORDER);

有些人觉得它令人困惑,但它提高了性能,因为可能有太多与图像相关的细节,如日期、时间、标题、地点、纬度、经度等,如果查询针对存储的所有图像,这会降低性能(通常它可以是数千张图像),因此数据更少,时间更少,因此性能更好。

详细信息:某些图像可能没有所需的信息,可能来自其他应用程序或从某些网站下载等,因此请使用更新信息。

更新:您可以关注this解决少数有问题的图像的方法

关于android - MediaStore 图像宽度和高度 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39454731/

相关文章:

android - 是什么让这个 Android 应用程序可以调试

android - 哪些 R8 规则需要在 Google Play 商店发布后才能运行带有 libgdx 游戏的 Android 应用程序?

android - android中如何过滤铃声、闹钟及相关媒体文件

android - 从自定义键盘复制/粘贴剪贴板

android - 在SD卡上添加或删除或修改任何文件后,如何刷新或重新启动MediaStore?

android - Android10。MediaStoreDATE_TAKEN始终返回null

java - Android - 视频文件的缩略图

android - 清除 ArcGIS Runtime for Android 中的 MapView 图层

android - 如何避免在onDraw上花费很长时间?

java - Gridview 适配器无法从外部存储读取,奇怪的循环迭代