在Android中从uri查询时,可以从Cursor Window读取第0行col -1

时间:2014-11-07 11:15:46

标签: android sqlite cursor

我知道有很多类似的问题,我已经阅读了大部分内容,并且与其他内容有关。 我有这个错误:

 java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:1, request=2, result=-1, data=Intent { dat=content://com.google.android.gallery3d.provider/picasa/item/5953655552200168930 flg=0x1 }} to activity {std.app/std.app.activity.MainActivity}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

问题是它适用于某些设备,有些则不适用。例如,它适用于SGS2,但不适用于Nexus 7。 更多日志:

 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.
    at android.database.CursorWindow.nativeGetString(Native Method)
    at android.database.CursorWindow.getString(CursorWindow.java:434)
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
    at android.database.CursorWrapper.getString(CursorWrapper.java:114)
    at std.app.util.PhotoUtils.getRealPathFromURI(PhotoUtils.java:124)
    at std.app.fragments.DayFragment.onActivityResult(DayFragment.java:167)
    at android.app.Activity.dispatchActivityResult(Activity.java:5427)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3347)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3394)
    at android.app.ActivityThread.access$1300(ActivityThread.java:135)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5001)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    at dalvik.system.NativeStart.main(Native Method)

以下是产生错误的代码:

    public static String getRealPathFromURI(Context context, Uri contentURI) {
    String result;
    Cursor cursor = context.getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) {
        result = contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        result = cursor.getString(idx); // this line
        cursor.close();
    }
    return result;
}

MediaStore.Images.ImageColumns.DATA在不同版本中是否有所不同?如何解决这个问题?

编辑: 我注意到这不是版本的问题,而是源码的问题。仅当我从Picassa文件夹中选择图片时才会显示此错误。

1 个答案:

答案 0 :(得分:3)

那是因为云同步照片(a.k.a. Picassa文件夹)在SD卡或内部存储器中没有物理地址,它不是设备上的物理文件。列MediaStore.Images.ImageColumns.DATA用于设备上的物理文件。

“抓取”此图像的方法是打开一个Stream并将图像复制到您控制的文件夹(应用程序中的临时文件夹,可能来自Context.getCacheDir()方法)。

     InputStream is = context.getContentResolver().openInputStream(uri);
     OutputStream os = new BufferedOutputStream(new FileOutputStream(tempFile));

然后继续从输入复制到输出并在结束时关闭流。 请记住,此过程是网络操作,这意味着您永远不应该从UI线程执行此操作。

如果您使用的是像Picasso这样的图像库(您应该经常使用),您可以让它为您完成所有工作,并将Uri直接传递给它{ {1}}此目标可以是Picasso.with(context).load(uri).into(target);,也可以是ImageView

的任何对象