android getContentResolver().insert()偶尔返回null
我有一段代码,旨在启动android摄像头,让用户拍照,并在保存后保留图像的uri 到目前为止,我已经设法让它工作。然而,应用程序有50/50的可能会因为NPE而崩溃。我不知道为什么会这样 我的代码: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
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);
}
完美答案。谢谢刚刚测试过,效果很好,完美答案。谢谢刚刚测试过,效果很好