MediaStore获取图片的高度/宽度

4

我正在查询MediaStore.Images.Media.EXTERNAL_CONTENT_URI,并且查询工作正常。我能够获取每个具有常量的列中的数据,例如:

currentImage.ImageUrl = imagecursor.getString(imagecursor.getColumnIndex(MediaStore.Images.Media.DATA));
            currentImage.Lat = imagecursor.getString(imagecursor.getColumnIndex(MediaStore.Images.Media.LATITUDE));
            currentImage.Long = imagecursor.getString(imagecursor.getColumnIndex(MediaStore.Images.Media.LONGITUDE));

宽度/高度列没有常量(没有MediaStore.Images.Media.WIDTH),因此我正在尝试使用imagecursor.getLong(imagecursor.getColumnIndex("width"));访问它们。

尝试使用getLong、getString、getInt等方法,但都无效 - 总是崩溃。

这是堆栈信息:

02-22 19:38:26.242: E/AndroidRuntime(1607): FATAL EXCEPTION: main
02-22 19:38:26.242: E/AndroidRuntime(1607): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.MEDIA_SCANNER_FINISHED dat=file:///mnt/sdcard flg=0x10 } in com.Activity.android.chat.service.ChatService$ChatServiceReceiver@415b26c0
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:737)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.os.Handler.handleCallback(Handler.java:605)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.os.Looper.loop(Looper.java:137)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.app.ActivityThread.main(ActivityThread.java:4424)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at java.lang.reflect.Method.invokeNative(Native Method)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at java.lang.reflect.Method.invoke(Method.java:511)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at dalvik.system.NativeStart.main(Native Method)
02-22 19:38:26.242: E/AndroidRuntime(1607): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.database.CursorWindow.nativeGetLong(Native Method)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.database.CursorWindow.getLong(CursorWindow.java:515)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.database.CursorWindow.getInt(CursorWindow.java:582)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:69)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.database.CursorWrapper.getInt(CursorWrapper.java:102)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at com.Activity.android.chat.service.ChatService.getUserImages(ChatService.java:251)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at com.Activity.android.chat.service.ChatService.access$1(ChatService.java:209)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at com.Activity.android.chat.service.ChatService$ChatServiceReceiver.onReceive(ChatService.java:204)
02-22 19:38:26.242: E/AndroidRuntime(1607):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:728)
02-22 19:38:26.242: E/AndroidRuntime(1607):     ... 9 more

希望你能帮忙解决这个问题...不知道还有什么其他方法可以尝试。

谢谢!

3个回答

10

解决方案(愚蠢的错误...):

我没有在投影中包含宽度和高度列... 无法理解为什么Google不会给出常量来避免所有这些混乱,但无论如何,解决方法是添加它们。

final String[] columns = {
                MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE, MediaStore.Images.Media.DATE_TAKEN,
                MediaStore.Images.Media.SIZE, MediaStore.Images.Media.LATITUDE, MediaStore.Images.Media.LONGITUDE, "width", "height"
        };

我遇到了同样的问题并使用了这个代码。但是它报错:"没有这样的列:width"。你能否帮助我? - Farid Ala
2
@Farid Ala 当然可以!我认为“width”和“height”列仅适用于Android 3.0及以上版本,因此如果您尝试在较低的Android版本上访问它们,它会给出“没有这样的列”的错误。您可以通过使用Root Explorer打开mediaStore数据库来检查是否具有这些列-> Data-> Data-> com.android.providers.media-> databases-> external.db-> images。 - Lior Iluz
谢谢您的回复。您说得对,它只适用于Android 3.0及以上版本。那么,在Android 3.0以下版本中,我该如何获取图像大小呢?我需要使用Samir的解决方案吗?正如您所提到的,这有点昂贵。我真的很困惑。 - Farid Ala
@Farid Ala 这有点贵,但你可以使用Samir的代码构建自己的对象来保存所有图像信息,包括高度和宽度,然后再用新对象填充列表(getView)。这样,昂贵的操作将在列表适配器的getView之外发生,列表将滚动更加流畅。 - Lior Iluz
你说得对。实际上我的应用程序使用了AndEngine,我将通过Sprites显示图像。这个线程帮了我很多。谢谢 :-) - Farid Ala

5
        try {
                    Bitmap _bitmapPreScale = BitmapFactory.decodeFile(imagePath);

                    int oldWidth = _bitmapPreScale.getWidth();
                    int oldHeight = _bitmapPreScale.getHeight();
    }catch(Exception e){
         e.printstacktrace();
               }

谢谢,但对于我的操作来说,这太昂贵了......运行在1000张图像上并解码每一张是我想要避免的事情,尤其是当宽度和高度列存在于mediastore.images数据库中时。 - Lior Iluz

1

我做了...但那不是它。谢谢;) - Lior Iluz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接