【问题标题】:Capture Image using Camera, File created but not returning in ActivityResult使用相机捕获图像,文件已创建但未在 ActivityResult 中返回
【发布时间】:2018-09-11 18:22:15
【问题描述】:

我已经解决了大部分关于使用相机 Intent 的 activityresult 返回 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 或 2 次,使用相机可以正常工作,但单击 2 次以上会崩溃并显示此错误:

无法恢复活动 java.lang.RuntimeException:失败 传递结果 ResultInfo{who=null, request=2, result=-1, data=null} 到活动 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) 在 android.app.ActivityThread.access$1000(ActivityThread.java:166) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1287)

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

【问题讨论】:

  • 为了避免 oom 错误,请尝试使用 Glide 或 Picasso 等图像加载库

标签: android file android-intent android-camera onactivityresult


【解决方案1】:

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

This sample project(来自this book)说明了如何使用保存的实例状态Bundle 来保持文件位置。它还演示了如何使用 FileProvider,如果您希望您的应用在 Android 7.0+ 设备上运行,您将需要使用 Uri.fromFile() will not work

【讨论】:

  • 是的,这就是一直在发生的事情。但是有没有办法防止我的活动无论如何都被破坏?
  • 不,您无法控制系统。如果相机应用需要更多内存来处理图片捕获,Android 将终止所有后台应用以释放资源。
  • @JoshanTandukar:更重要的是,这不仅限于启动相机应用程序。每当您的应用不再处于前台时,Android 都可以终止您的进程以释放 RAM 以供其他应用使用。
  • 知道了,谢谢。我以为发生这种情况时我无能为力,但我尝试在启动相机之前重新创建捆绑实例保存它并在发生异常时取回。谢谢老哥,帮了大忙。我被困在那里 5 天了。
【解决方案2】:

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

【讨论】:

  • 对不起,先生,我不得不提到数据总是返回 null,但我正在从“filepath”解析,但图像已经存储在内存中,但“file.getAbsolutePath”没有返回任何内容。并且取消工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2019-07-09
  • 2015-09-03
相关资源
最近更新 更多