0

ねえ、私はこのエラーを理解できないようです。写真を撮るか、ギャラリーから選択して画像を選択しようとしています。選択した画像でこの方法を試してみるとうまくいきますが、カメラから画像を撮ると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();
        }
    }

これによりnullポインター例外が発生し、その理由がわかりません。

何か助けはありますか?

編集:

これは私がインテントと呼ぶ方法です:

     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);
     }
}
4

1 に答える 1

1

ContentResolver.query(...)は、ドキュメントに記載されているようにnullを返す場合があります

ブロックの実行を停止するが、コードを実行している可能性cursor.moveToFirst()が非常に高いです:これは=>KABAMです。NullPointerExceptiontryfinally
cursor.close()null.close()

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;
    }
}
于 2012-06-17T17:27:43.933 に答える