0

嘿,我似乎無法理解這個錯誤。 我試圖通過拍照或從圖庫中選擇圖像。 當我嘗試的方法選擇的圖像,它工作正常,但是當我從相機拍攝的圖像我上cursor.close()行錯誤的NullPointerException當試圖獲取圖像方向

我有這樣的代碼從庫捕捉圖像:

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) { 
    Uri selectedImage = mImageUri; 
    getContentResolver().notifyChange(selectedImage, null); 
    ImageView imageView = (ImageView) findViewById(R.id.chosenImage2); 
    ContentResolver cr = getContentResolver(); 

    try { 
     bitmap = android.provider.MediaStore.Images.Media 
     .getBitmap(cr, selectedImage); 
     //flip image if needed 
     bitmap = Helpers.flipBitmap(bitmap, Helpers.getOrientation(this, selectedImage)); 

     imageView.setImageBitmap(bitmap); 

    } catch (Exception e) { 
     Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT) 
       .show(); 
     e.printStackTrace(); 
     Log.e("Camera", e.toString()); 

    } 

} 

這是getOrientation代碼:

public static int getOrientation(Context context, Uri photoUri) { 
     Cursor cursor = context.getContentResolver().query(photoUri, 
       new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, 
       null, null, null); 

     try { 
      if (cursor.moveToFirst()) { 
       return cursor.getInt(0); 
      } else { 
       return -1; 
      } 
     } finally { 
      cursor.close(); 
     } 
    } 

這生成空指針異常,我不明白爲什麼。

任何幫助?

編輯:

這是我所說的意圖:

 ImageView imageView = (ImageView) findViewById(R.id.chosenImage2); 
    if(imageView.getDrawable() == null){ 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     File photo = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+ ".jpg"); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, 
     Uri.fromFile(photo)); 
     mImageUri = Uri.fromFile(photo); 
     startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
    } 
} 

回答

1

ContentResolver.query(...)可能返回null,你可以在documentation找到。

很可能cursor.moveToFirst()拋出NullPointerException停止try塊的執行而運行finally代碼:
cursor.close()它是null.close() => Kabam的。

你可以在各個地方檢查cursor != null。例如。在輸入try區塊或finally區塊之前。

但最安全的方法是捕獲NullPointerException。

public static int getOrientation(Context context, Uri photoUri) { 
    Cursor cursor = context.getContentResolver().query(photoUri, 
      new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, 
      null, null, null); 
    //cursor might be null! 

    try { 
     int returnMe; 
     if (cursor.moveToFirst()) { 
      returnMe = cursor.getInt(0); 
     } else { 
      returnMe = -1; 
     } 
     cursor.close(); 
     return returnMe; 
    } catch(NullPointerException e) { 
     //log: no cursor found returnung -1! 
     return -1; 
    } 
} 
+1

除此之外,它很可能是零,因爲你的URI參數是無效的。一個可能的原因是你沒有恢復活動狀態,並且mImageUri領域成爲開啓相機後空。 –

+0

這會使錯誤消失,但它不會再獲取圖像方向。和Paul-Jan,我不明白轉動相機的方式是如何相關的,我只是提出了活動結果,並且只做了活動肖像,以至於不能成爲原因。 –

+0

對不起,對於遲到的答覆的方式:)經過適當的錯誤處理是時間來質疑爲什麼錯誤發生 - 閱讀:爲什麼'遊標'爲空? Aus Paul-Jan指出機會很高'photoUri'無效,因此'光標'的創建失敗。看看第一個代碼塊,我看到這個moethod就像'Helpers.getOrientation(this,selectedImage)'一樣被調用,而基本上'selectedImage = mImageUri'。後者「從代碼天堂下降」。如果你不能從這裏解決它,我會建議打開另一個更具體的問題。 – yoshi

相關問題