此代码曾与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是处理较新的基于云的照片应用程序的错误方式。
答案 0 :(得分:1)
URI 不表示存在文件。应用程序能够通过它想要的任何机制提供内容(本地文件,私人目录中的本地文件,您无法读取,通过互联网流式传输,动态构建)。
相反,您应该使用ContentResolver.openInputStream(contentUri)从URI中获取内容。然后,您可以通过BitmapFactory.decodeStream()
将其转换为位图