Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android getContentResolver().insert()偶尔返回null_Android - Fatal编程技术网

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

android getContentResolver().insert()偶尔返回null,android,Android,我有一段代码,旨在启动android摄像头,让用户拍照,并在保存后保留图像的uri 到目前为止,我已经设法让它工作。然而,应用程序有50/50的可能会因为NPE而崩溃。我不知道为什么会这样 我的代码: private Uri mImageCaptureUri; private void doTakePhotoAction() { String fileName = "temp.jpg"; ContentValues values = new ContentV

我有一段代码,旨在启动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
为空。有没有人对如何解决/解决这个问题或为什么会发生这种情况有任何想法

你真的必须牢记Android活动的第一条规则:Android可能会在任何时候决定终止你的活动,重置过程中的所有成员变量。一旦需要处理ActivityResult上的
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);
    }

你真的必须牢记Android活动的第一条规则:Android可能会在任何时候决定终止你的活动,重置过程中的所有成员变量。一旦需要处理ActivityResult上的
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);
    }

完美答案。谢谢刚刚测试过,效果很好,完美答案。谢谢刚刚测试过,效果很好