我想写一个活动:
- 显示相机预览(取景器),并有一个“捕捉”按钮。
- 当按下“捕获”按钮时,拍摄一张照片并将其返回给调用活动(setResult() & finish())。
是否有适用于每台设备的完整示例?一个可以拍照的简单开源应用程序的链接将是理想的答案。
到目前为止我的研究:
这是一个常见的场景,并且有很多关于此的问题和教程。
主要有两种方法:
- 使用 android.provider.MediaStore.ACTION_IMAGE_CAPTURE 事件。看到这个问题
- 直接使用相机 API。请参阅此示例或此问题(有很多参考资料)。
方法 1 本来是完美的,但问题是每个设备上的意图是不同的。在某些设备上它运行良好。但是,在某些设备上,您可以拍照,但它永远不会返回到您的应用程序。在某些设备上,当您启动意图时没有任何反应。通常它还会将图片保存到 SD 卡中,并且需要 SD 卡存在。每个设备上的用户交互也不同。
方法2的问题是稳定性。我尝试了一些示例,但我设法阻止相机在某些设备上工作(直到重新启动)并完全冻结另一台设备。在另一台设备上捕获工作,但预览保持黑色。
我会使用 ZXing 作为示例应用程序(我经常使用它),但它只使用预览(取景器),不拍照。我还发现在某些设备上,ZXing 没有在光照条件发生变化时自动调整白平衡,而原生相机应用程序却可以正常进行(不确定是否可以修复)。
更新:
有一段时间我直接使用相机 API。这提供了更多控制(自定义 UI 等),但我不会向任何人推荐它。我会在 90% 的设备上工作,但时不时会发布新设备,但会遇到不同的问题。
我遇到的一些问题:
- 处理自动对焦
- 处理闪光灯
- 支持带有前置摄像头、后置摄像头或两者的设备
- 每个设备都有不同的屏幕分辨率、预览分辨率(并不总是与屏幕分辨率匹配)和图片分辨率的组合。
所以总的来说,我不建议走这条路,除非没有其他办法。两年后,我放弃了自定义代码并切换回基于 Intent 的方法。从那以后,我遇到的麻烦少了很多。我过去在基于 Intent 的方法中遇到的问题可能只是我自己的无能。
如果你真的需要走这条路,我听说如果你只支持 Android 4.0+ 的设备会容易得多。