【问题标题】:Android IMAGE_CAPTURE intent saves photo after onActivityResultAndroid IMAGE_CAPTURE 意图在 onActivityResult 后保存照片
【发布时间】:2015-10-17 14:24:55
【问题描述】:

我正在尝试使用 IMAGE_CAPTURE 意图拍照并立即在屏幕上显示这张照片。我做什么:

File photoFile = createImageFile();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(intent, REQUEST_CAMERA);

创建图片文件方法:

private File createImageFile() {
    File dir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File photoFile = null;
    try {
        photoFile = File.createTempFile("photo", ".jpg", dir);
        mPhotoPath = photoFile.getAbsolutePath();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return photoFile;
}

onActivityResult 被调用时,我执行:

Bitmap photo = BitmapFactory.decodeFile(mPhotoPath);
mPhoto.setImageBitmap(photo);

这是一个问题。显然 IMAGE_CAPTURE 活动将图像保存到后台文件中,并且我的onActivityResult 被执行之前图像被保存。因此我的photo == null。虽然如果我在BitmapFactory.decodeFile 调用之前放置断点,它会起作用。我用一个丑陋的 hack 修复了它:

while (photo == null) {
    photo = BitmapFactory.decodeFile(mPhotoPath);
}

那么,我做错了吗?为什么会这样?

我正在 Marshmallow Nexus 5 上进行测试。

【问题讨论】:

  • 使用onSaveInstanceState()onRestoreInstanceState 保存文件路径。请参阅此SO Answer

标签: android android-intent android-image-capture


【解决方案1】:

显然 IMAGE_CAPTURE 活动将图像保存到后台文件中,并且我的 onActivityResult 在图像保存之前被执行

我认为这是处理您的请求的特定相机应用程序中的一个错误。有数百甚至数千个这样的相机应用程序,这样的错误有点常见。

我用一个丑陋的 hack 修复了它

像这样的繁忙循环绝不是一个好主意。除此之外,如果在主应用程序线程中完成,它会冻结您的 UI,即使在后台线程中完成也会严重占用 CPU。

我会尝试a FileObserver 来观察文件何时关闭,以便更受事件驱动。如果,由于某种原因,你不能让它工作:

  • 确保您在后台线程中执行监视文件逻辑
  • 在尝试之间添加合理的SystemClock.sleep() 时间段(例如,50 毫秒)

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    相关资源
    最近更新 更多