2012-02-07 8 views
1

アンドロイドカメラの起動を目的としたコードがあります。ユーザーが写真を撮って、保存したら画像のURIを保持できるようにします。android getContentResolver()。時折nullを返す場合があります。

これまでのところ、私はそれを動作させることができました。しかし、アプリがNPEでクラッシュする確率は50/50のようです。

private Uri mImageCaptureUri; 

private void doTakePhotoAction() { 
     String fileName = "temp.jpg"; 
     ContentValues values = new ContentValues(); 
     values.put(MediaStore.Images.Media.TITLE, fileName); 
     mImageCaptureUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri); 
     startActivityForResult(intent, PICK_FROM_CAMERA); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode != RESULT_OK) { 
     return; 
    } 

    switch (requestCode) { 
    case PICK_FROM_CAMERA: 
     String[] projection = { MediaStore.Images.Media.DATA}; 
     Cursor cursor = managedQuery(mImageCaptureUri, projection, null, null, null); 
     int column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     String capturedImageFilePath = cursor.getString(column_index_data); 
     Intent intent = new Intent(this, CropImage.class); 
     intent.putExtra("image-path", capturedImageFilePath); 
     intent.putExtra("scale", true); 
     startActivity(intent); 
     break; 
    } 
} 

NPEエラーが

Cursor cursor = managedQuery(mImageCaptureUri, projection, null, null, null); 

バックラインに私を参照し、mImageCaptureUriがヌルであるため、それがスローされている:私はなぜこれが

私のコードを起こっている見当がつかない。あなたは本当に心にAndroidの活動の最初のルールを取らなければなら誰もがこの問題を回避/仕事を修正する方法上の任意のアイデアを持っていますか、なぜこれが事実で

答えて

8

が起こっている:アンドロイドはであなたを殺すためにあらゆる時間を決定してもよいですアクティビティ、プロセス内のすべてのメンバ変数をリセットします。 onActivityResultを処理する必要がある場合は、単にアクティビティを再構築しますが、特定のハンドラでmImageCaptureUriを初期化すると、nullになります。

あなたの例の古典的な原因は、起動した「画像をキャプチャする」アクティビティ(オリエンテーションの変更は一般的にアクティビティを殺す)の間にオリエンテーションの変更になりますが、アンドロイドが終了することになる理由はたくさんありますそれは記憶不足、電話着信、悪い髪の日の電話など)。

溶液、すなわち

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     if (savedInstanceState != null) 
     { 
      mImageCaptureUri = savedInstanceState.getParcelable("imageCaptureUri"); 
     } 
    } 

    protected void onSaveInstanceState(Bundle outState) 
    { 
     outState.putParcelable("imageCaptureUri", mImageCaptureUri); 
    } 
+0

完璧な答えを格納しonSaveInstanceState()mImageCaptureUriような状態を復元、および活性のonCreate()でそれを復元することです。ありがとうございました! - ちょうどそれをテストし、それは素晴らしい動作します –

関連する問題