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