尝试获取图像方向时出现NullPointerException

时间:2012-06-17 17:11:32

标签: android nullpointerexception android-camera android-cursor

嘿,我似乎无法理解这个错误。 我试图通过拍照或从画廊中选择来选择图像。 当我在选定的图像上尝试该方法时,它工作正常,但当我从相机拍摄图像时,我在cursor.close()行上得到错误

我有这个代码来从图库中捕获图像:

    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 个答案:

答案 0 :(得分:1)

ContentResolver.query(...)可能会返回null,因为您可以在documentation中找到。

cursor.moveToFirst()很可能会NullPointerException停止try阻止执行finally阻止但运行cursor.close()代码:
null.close() = cursor != null = { Kabam的。

您可以在不同的地方查看try。例如。在进入finally块或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; } } 块之前。

然而,最安全的方法是捕获NullPointerException。

{{1}}