我正在尝试使用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
调用之前放置断点,它会起作用。我用一个丑陋的黑客修复它:
while (photo == null) {
photo = BitmapFactory.decodeFile(mPhotoPath);
}
那么,我做错了吗?为什么这样工作?
我正在测试Marshmallow Nexus 5.
答案 0 :(得分:1)
显然IMAGE_CAPTURE活动将图像保存到后台文件中,并在保存图像之前执行onActivityResult
我认为这是处理您请求的特定相机应用中的错误。有数百甚至数千个这样的相机应用程序,这样的错误有点普遍。
我用一个丑陋的黑客修复它
这样的繁忙循环从来都不是一个好主意。除此之外,如果在主应用程序线程中完成,它将冻结您的UI,即使在后台线程上完成,它也会严重损坏CPU。
我会尝试a FileObserver
来关注文件关闭的时间,以便更加事件驱动。无论出于何种原因,如果你无法解决这个问题:
SystemClock.sleep()
个句点(例如,50ms)