2012-02-07 244 views
1

我有一段代码旨在启动安卓相机,让用户拍照并保存图片的最后一次。android getContentResolver()。insert()偶尔会返回null

到目前为止,我设法让它工作。不过,这款应用程序似乎有50/50的机会会与NPE一起崩溃。我不知道为什么会这样

我的代码:

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为空。有没有人对如何解决/工作围绕这个或为什么这是事实发生

任何想法

回答

8

你真的要好好心脏的Android活动的第一条规则:的Android可以在决定任何时间来杀死你活动,重置进程中的所有成员变量。它只会重建活动,一旦它需要处理onActivityResult ...但是当您在您的特定处理程序中初始化mImageCaptureUri时,它现在将是null

经典的原因在你的例子是一个方向变化启动的“捕获图像”活动期间(方向的变化通常会杀死活性),但有其他原因的Android会决定终止无数它(缺乏记忆,来电,电话头发不好等)。

溶液是存储和在onSaveInstanceState()恢复像mImageCaptureUri状态,并且它在活动的onCreate()恢复,即

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

完美的答案。谢谢! - 只是测试它,它效果很好 – 2012-02-07 19:45:23