0

这并不总是发生,所以我无法正确理解发生了什么:我的应用程序拍摄并修改了一张图片,然后将其保存在外部存储中。如果我尝试在应用程序中打开一个来自文件管理器而不是来自画廊的新保存图片,它在执行 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);
    }
4

2 回答 2

2

您可以使用

if(cursor.moveToFirst()) 
{
    //Your code here
}

而是关闭

cursor.getCount() 

如果光标大小大于0,它将返回true,否则将返回false........所以你可以这样写............

if (!cursor.moveToFirst())
   return -1;

else 
   return 1;
于 2012-08-24T13:43:57.453 回答
0

使用 this 而不是 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。这就是您将光标设为空的原因。

一种方法是查询整个 Mediastore 并获取 MediaStore.Images.Media.DATA 列并与从 uri 获得的路径进行比较

于 2012-08-24T13:43:03.787 回答