gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:33:40 25 4
gpt4 key购买 nike

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

到目前为止,我已经设法让它工作了。但是,应用程序因 NPE 而崩溃的可能性似乎是 50/50。我不知道为什么会这样

我的代码:

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 为 null。有没有人对如何解决/解决这个问题或者为什么会发生这种情况有任何想法

最佳答案

您真的必须牢记 Android Activity 的第一条规则:Android 可能会在任何时间决定终止您的 Activity ,并重置该过程中的所有成员变量。它会在需要处理 onActivityResult 时简单地重建 Activity ...但是当您在特定处理程序中初始化 mImageCaptureUri 时,它现在将为 null.

在您的示例中,典型的原因是在启动的“捕获图像” Activity 期间发生方向变化(方向变化通常会终止该 Activity ),但还有无数其他原因导致 android会决定终止它(内存不足、来电、手机发质不佳等)。

解决方案是在onSaveInstanceState()中存储和恢复像mImageCaptureUri这样的状态,并在onCreate()中恢复 Activity 的 ,即

   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 getContentResolver().insert() 偶尔会返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9182022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com