当前位置: 代码迷 >> Android >> Android IMAGE_CAPTURE意向在onActivityResult之后保存照片
  详细解决方案

Android IMAGE_CAPTURE意向在onActivityResult之后保存照片

热度:17   发布时间:2023-08-04 09:52:16.0

我正在尝试使用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);
}

所以,我做错什么了吗? 为什么这样工作?

我正在棉花糖Nexus 5上进行测试。

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

我认为这是处理您的请求的特定相机应用程序中的错误。 有数百种(即使不是数千种)此类相机应用程序,此类错误有些常见。

我用一个难看的hack修复了它

这样的繁忙循环绝不是一个好主意。 除其他外,如果在主应用程序线程中完成操作,它将冻结您的UI,即使在后台线程中完成操作,也将严重消耗CPU。

我将尝试来观察文件关闭的时间,以便更多地由事件驱动。 如果出于某种原因您无法使它正常工作:

  • 确保您正在后台线程中执行文件监视逻辑
  • 尝试之间添加合理的SystemClock.sleep()周期(例如50ms)
  相关解决方案