android getContentResolver()。insert()偶尔返回null

时间:2012-02-07 18:49:37

标签: android

我有一段代码旨在启动Android相机,让用户拍照并最终保存图像的uri。

到目前为止,我已成功实现了它。但是,似乎有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为空而被抛出。有没有人对如何解决/解决这个问题或为什么会发生这种情况有任何想法

1 个答案:

答案 0 :(得分:8)

您必须牢记Android活动的第一条规则: Android可能决定任何时间来杀死您的活动,重置此过程中的所有成员变量。一旦需要处理onActivityResult,它就会重建活动...但是当您在特定处理程序中初始化mImageCaptureUri时,它现在将 null

您的示例中的经典原因是在启动的“捕获图像”活动期间方向更改(方向更改通常会杀死活动),但是有许多其他原因导致android将决定终止它(缺乏记忆,来电,电话有一个糟糕的发型日等)。

解决方案用于存储和恢复mImageCaptureUri中的onSaveInstanceState()状态,并将其恢复到活动的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);
    }