这并不总是发生,所以我无法正确理解发生了什么:我的应用程序采取并修改图片,然后将其保存在外部存储器中。如果我尝试在应用程序中打开一个新的保存图片来自一个文件管理器而不是从画廊,它在执行cursor.getCount()时崩溃,在DDMS中我读取错误:“光标未在最终之前关闭”这是一块代码所在的问题是,我可以在必要时发布更多内容,谢谢! ps这段代码取自stackoverflow中的其他答案,因为你可以期待我不是专家所以请耐心等待我,谢谢 pps我保存后无法在图库中看到即时图像,当它们出现在图库中时,此错误消失了。
public static int getOrientation(Context context, Uri photoUri) {
/* it's on the external media. */
Cursor cursor = context.getContentResolver().query(photoUri,
new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null);
if (cursor.getCount() != 1) { //HERE IS THE PROBLEM
return -1;
}
cursor.moveToFirst();
return cursor.getInt(0);
}
答案 0 :(得分:2)
您可以使用
if(cursor.moveToFirst())
{
//Your code here
}
而不是
cursor.getCount()
如果游标大小大于0,它将返回true,否则它将返回false ........所以你可以像这样写.........
if (!cursor.moveToFirst())
return -1;
else
return 1;
答案 1 :(得分:0)
使用此代替return语句。光标因为你没有关闭而被泄露
try{
if (cursor.getCount() != 1) { //HERE IS THE PROBLEM
return -1;
}
int i = 0;
i++;
cursor.moveToFirst();
return cursor.getInt(0);
}finally{
if(cursor != null)
cursor.close();
}
编辑:
当您从文件管理器打开文件时,uri的格式为file:/// sdcard / filename,但Mediastore只能理解格式为content:// media / audio / 1的uri。这是您将游标变为null的原因。
一种方法是查询整个Mediastore并获取MediaStore.Images.Media.DATA列并与从uri获得的路径进行比较