2012-08-24 101 views
0

這並不總是發生,所以我無法正確理解發生了什麼事情:我的應用程序需要修改一張圖片,然後將其保存在外部存儲中。如果我嘗試在應用程序中打開一個新的保存的圖片從一個文件管理器,而不是從畫廊,它執行cursor.getCount()時崩潰,在DDMS我讀錯誤:「光標沒有關閉最後」這是一塊代碼問題的地方,我可以發佈更多,如果有必要,謝謝! ps此代碼是從其他答案取自這裏在stackoverflow,因爲你可以指望我不是專家,所以請耐心等待我,謝謝 pps我看不到在圖庫中的立即圖像保存後,當他們出現在畫廊這個錯誤消失。執行cursor.getCount()(Android)時發生崩潰

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

首先,在使用遊標的任何方法之前,檢查遊標是否不爲空。 –

回答

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將窗體文件:/// SD卡/文件名,但Mediastore能只瞭解uri的格式內容:// media/audio/1。這就是你將光標作爲空值的原因。

一種方法是查詢整個Mediastore並獲得MediaStore.Images.Media.DATA列,併爲您從URI

+0

好吧,這是好的,但沒有解決我的問題(也許解決了一個,這不是唯一的),我現在注意到問題是遊標爲空。這種情況只發生在新保存的圖像上,一段時間後圖像出現在圖庫中一切正常。是這一行:Cursor cursor = context.getContentResolver()。query(photoUri, new String [] {MediaStore.Images.ImageColumns.ORIENTATION},null,null,null);正確?謝謝 – c0rtexx

+0

檢查編輯。 – nandeesh

+0

非常感謝您,如果您可以舉例說明如何做到這一點,那就太好了,謝謝。 (或只是告訴我在哪裏尋找,我不想讓你浪費你的時間) – c0rtexx

2

獲取路徑比較可以使用

if(cursor.moveToFirst()) 

,而不是關閉

cursor.getCount() 

如果光標大小是大於0,否則,它會返回false,它將返回true ........所以你可以寫這樣的.........

if (!cursor.moveToFirst()) 
{ 
    return -1; 
} 
else 
return 1;