尝试从Google相册应用中选择照片时出现IllegalStateException

时间:2015-08-07 14:46:33

标签: java android android-intent

此代码曾与Nexus 5图片库配合使用。自从迁移到较新的Google相册应用程序后,选择图像会导致此代码崩溃。

错误:

  

08-07 10:10:10.792 25086-25086 / com.app.app E / CursorWindow:失败   从CursorWindow读取第0行,第-1列,其中包含1行,7列。   08-07 10:10:10.795 25086-25086 / com.app.app D / AndroidRuntime:正在关闭   VM 08-07 10:10:10.801 25086-25086 / com.app.app E / AndroidRuntime:   致命异议:主要       过程:com.app.app,PID:25086       java.lang.RuntimeException:传递结果失败ResultInfo {who = null,request = 2,result = -1,data = Intent {   DAT =含量://com.google.android.apps.photos.contentprovider/-1/1/content://媒体/外部/图像/媒体/ 17870 /实际/ 1285012603   flg = 0x1(有剪辑)}}到活动   {} com.app.app/com.app.app.PhotoActivity:   java.lang.IllegalStateException:无法从中读取第0行,第1行   CursorWindow。确保之前正确初始化了Cursor   从中访问数据。               在android.app.ActivityThread.deliverResults(ActivityThread.java:3574)               在android.app.ActivityThread.handleSendResult(ActivityThread.java:3617)               在android.app.ActivityThread.access $ 1300(ActivityThread.java:151)               在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1352)               在android.os.Handler.dispatchMessage(Handler.java:102)               在android.os.Looper.loop(Looper.java:135)               在android.app.ActivityThread.main(ActivityThread.java:5254)               at java.lang.reflect.Method.invoke(Native Method)               在java.lang.reflect.Method.invoke(Method.java:372)               在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)               在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)        引起:java.lang.IllegalStateException:无法从CursorWindow读取第0行,col -1。确保Cursor已初始化   在从它访问数据之前正确。               在android.database.CursorWindow.nativeGetString(本机方法)               在android.database.CursorWindow.getString(CursorWindow.java:438)               在android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)               在android.database.CursorWrapper.getString(CursorWrapper.java:114)               在com.app.app.PhotoActivity.getRealPathFromURI(PhotoActivity.java:456)               在com.app.app.PhotoActivity.onActivityResult(PhotoActivity.java:436)               在android.app.Activity.dispatchActivityResult(Activity.java:6192)               在android.app.ActivityThread.deliverResults(ActivityThread.java:3570)   在android.app.ActivityThread.handleSendResult(ActivityThread.java:3617)   在android.app.ActivityThread.access $ 1300(ActivityThread.java:151)   在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1352)   在android.os.Handler.dispatchMessage(Handler.java:102)   在android.os.Looper.loop(Looper.java:135)   在android.app.ActivityThread.main(ActivityThread.java:5254)   at java.lang.reflect.Method.invoke(Native Method)   在java.lang.reflect.Method.invoke(Method.java:372)   在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

ONACTIVITYRESULT:

case ACTION_SELECT_PHOTO: {
    if (resultCode == RESULT_OK) {
        Uri selectedImageURI = data.getData();
        File imageFile = new File(getRealPathFromURI(selectedImageURI)); // LINE 436
        mCurrentPhotoPath = imageFile.toString();
        if (mCurrentPhotoPath != null) {
            setPic();
            mCurrentPhotoPath = null;
        }
    }
    break;
}

GETREALPATHFROMURI:

private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor = 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); // HERE IS THE ERROR: LINE 456
        cursor.close();
    }
    return result;
}

我猜我的问题出现在两个地方之一,getContentResolver().query需要使用一些较新的方法。或getColumnIndex(MediaStore.Images.ImageColumns.DATA) MediaStore是处理较新的基于云的照片应用程序的错误方式。

1 个答案:

答案 0 :(得分:1)

URI 表示存在文件。应用程序能够通过它想要的任何机制提供内容(本地文件,私人目录中的本地文件,您无法读取,通过互联网流式传输,动态构建)。

相反,您应该使用ContentResolver.openInputStream(contentUri)从URI中获取内容。然后,您可以通过BitmapFactory.decodeStream()

将其转换为位图