我知道有很多类似的问题,我已经阅读了大部分内容,并且与其他内容有关。 我有这个错误:
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文件夹中选择图片时才会显示此错误。
答案 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