2015-10-17 17 views
1

我正在尝试使用IMAGE_CAPTURE意图拍照并立即在屏幕上显示此照片。我做什么:Android IMAGE_CAPTURE意图在onActivityResult后保存照片

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呼叫之前放置断点,它也可以工作。我用一个丑陋的黑客修复它:

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

所以,我做错了什么?为什么它以这种方式工作?

我对棉花糖的Nexus测试5.

+0

使用'onSaveInstanceState()'和'onRestoreInstanceState'来保存文件路径。请参阅此[SO答案](http://stackoverflow.com/a/32723550/3140227)。 –

回答

1

显然IMAGE_CAPTURE活动图像保存在后台文件和图像保存

我会认为这是一个我onActivityResult被执行处理您的请求的特定相机应用程序中的错误。有数百个,如果不是数千个这样的相机应用程序,并且这样的错误有点常见。

我的丑陋的黑客

这样的忙循环是不是一个好主意固定它。除此之外,如果在主应用程序线程中完成,它会冻结你的UI,并且即使在后台线程完成,它也会严重咀嚼CPU。

我会尝试a FileObserver来观察文件何时关闭,以便进行更多的事件驱动。如果出于某种原因,你不能得到那个工作:

  • 确保你正在做你的手表换了文件的逻辑在后台线程
  • 加试之间合理SystemClock.sleep()周期(例如, ,50ms)
相关问题