使用相机捕获图像,文件已创建但未在活动结果中返回



我已经完成了大多数关于使用相机意图返回 null 的活动结果的相关问题。这是我下面的代码:

String filepath;
File file;
Bitmap bitmap;
int previewcount=0;
@OnClick(R.id.lnrcamera)
public void opencamera()
{
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(this.getPackageManager()) != null)
{
try
{
file = createImageFile();
}
catch (IOException ex)
{
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (file != null)
{
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, FILE_CAMERA);
}
}
}
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName,  // prefix
".jpg",         // suffix
storageDir      // directory
);
// Save a file: path for use with ACTION_VIEW intents
filepath = "file:" + image.getAbsolutePath();
return image;
}

活动结果

else if (requestCode==FILE_CAMERA && resultCode == RESULT_OK)
{
try
{
Log.d("sdfasdfasdf", "onActivityResult: "+filepath.isEmpty());
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(filepath));
int newHeight = (bitmap.getHeight() * 500)/bitmap.getWidth();
bitmap = Bitmap.createScaledBitmap(bitmap, 500, newHeight, false);
list_bitmap.add(bitmap);
lnrpreview.setVisibility(View.VISIBLE);
Adapter_Image adapter_expenseCategory=new Adapter_Image(this, 0, list_bitmap, new RecyclerCallback() {
@Override
public void onPreviewDelete(List<Bitmap> list_bitmap)
{
Log.d("hereornot", "onPreviewDelete: "+list_bitmap.size());
previewcount--;
if (list_bitmap.size()==0)
{
lnrpreview.setVisibility(View.GONE);
imgpreviewcount.setImageResource(R.drawable.flagoff);
}
btxtpreviewcount.setBadgeCount(previewcount);
}
});
recycler.setAdapter(adapter_expenseCategory);
previewcount++;
btxtpreviewcount.setBadgeCount(previewcount);
imgpreviewcount.setImageResource(R.drawable.flagon);
}
catch (OutOfMemoryError e)
{
Toast.makeText(Activity_NewExpense.this, "Your device is out of Memory. Please free up some space.", Toast.LENGTH_SHORT).show();
}
catch (IndexOutOfBoundsException e)
{
Log.d("hereornot", "onPreviewDelete: "+e.getMessage());
}
catch (FileNotFoundException e)
{
Log.d("hereornot", "onPreviewDelete: "+e.getMessage());
}
catch (IOException e)
{
e.printStackTrace();
}
}

现在的问题是,每当我尝试打开相机并获取一些照片时,都会拍摄照片,并且它也在内存中,但活动不会向我返回文件路径。测试设备的内存不足。但是,对于 1 或两次点击,它使用相机工作正常,但超过两次点击它崩溃并说此错误:

无法恢复活动 java.lang.运行时异常:失败 交付结果 结果信息{谁=空, 请求=2, 结果=-1, data=null} to activity java.lang.NullPointerException 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2996( 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3025( 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396( 在 android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3974( at android.app.ActivityThread.access$1000(ActivityThread.java:166( 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1287(

由于图像可能很大,我调整了它的大小并设置了largeheap=true但不幸的是它不起作用。谁能指导我做错了什么?

最有可能的是,您的进程在后台时被终止。您需要在保存的实例状态Bundle中保留文件位置,以便在需要时可以将其取回。

此示例项目(来自本书(演示如何使用保存的实例状态Bundle来保留文件位置。它还演示了如何使用FileProvider,如果您希望您的应用程序在 Android 7.0+ 设备上运行,您将需要它,因为Uri.fromFile()将无法运行。

如果用户取消请求,数据将作为 NULL 返回。当您调用data.getExtras().get("data");时,线程将抛出 nullPointerException。我认为您只需要添加一个条件来检查返回的数据是否为空。