【问题标题】:IllegalStateException when trying selecting photo from Google Photos app尝试从 Google 相册应用中选择照片时出现 IllegalStateException
【发布时间】:2015-08-07 14:46:33
【问题描述】:

此代码用于 Nexus 5 图片库。自从迁移到较新的 Google 相册应用选择图像后,此代码就会崩溃。

错误:

08-07 10:10:10.792 25086-25086/com.app.app E/CursorWindow﹕未能 从具有 1 行 7 列的 CursorWindow 读取第 0 行第 -1 列。 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=content://com.google.android.apps.photos.contentprovider/-1/1/content://media/external/images/media/17870/ACTUAL/1285012603 flg=0x1 (有剪辑) }} 到活动 {com.app.app/com.app.app.PhotoActivity}: java.lang.IllegalStateException:无法读取第 0 行,列 -1 光标窗口。确保光标在之前正确初始化 从中访问数据。 在 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) 在 java.lang.reflect.Method.invoke(本机方法) 在 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。确保光标已初始化 在从中访问数据之前正确。 在 android.database.CursorWindow.nativeGetString(Native Method) 在 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) 在 java.lang.reflect.Method.invoke(本机方法) 在 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)

活动结果:

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 是处理新的基于云的照片应用程序的错误方法。

【问题讨论】:

    标签: java android android-intent


    【解决方案1】:

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

    相反,您应该使用 ContentResolver.openInputStream(contentUri) 从 URI 获取内容。然后,您可以通过BitmapFactory.decodeStream() 将其转换为位图

    【讨论】:

    • 我应该在我的onActivityResult 中输入ContentResolver.openInputStream(contentUri) 吗?
    • 是的,您可以在 Uri selectedImageURI = data.getData() 行之后使用它。
    • 这是随机的,但您知道如何在设置选项的同时从现有位图创建新位图吗?在更新到此代码之前,我使用 Bitmap bitmap = BitmapFactory.decodeFile(f, bmOptions); 发送的主要选项是 inSampleSize 用于缩放目的。我查看了createScaledBitmap,但它只使用高度和宽度。
    • inSampleSize 仅适用于 decodeZZZ() 方法,因为它不需要将整个位图读入内存。如果您已经有一个位图,那么您已经在内存中拥有它,您可以使用createScaledBitmap() 将高度/宽度除以 2、4 等来完成同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2011-05-10
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多