我想写一个 Activity :
- 显示相机预览(取景器),并有一个“捕捉”按钮。
- 当“捕捉”按钮被按下时,拍照并返回给调用 Activity (setResult() & finish())。
是否有适用于每台设备的完整示例?一个可以拍照的简单开源应用程序的链接将是理想的答案。
我目前的研究:
这是一个常见的场景,有很多关于这个的问题和教程。
主要有两种方法:
- 使用 android.provider.MediaStore.ACTION_IMAGE_CAPTURE 事件。见 this question
- 直接使用相机 API。见 this example或 this question (with lots of references) .
方法 1 本来是完美的,但问题是每个设备上的 Intent 实现方式不同。 在某些设备上运行良好。但是,在某些设备上,您可以拍照,但它永远不会返回到您的应用程序。在某些设备上,当您启动 Intent 时没有任何反应。 通常它还会将图片保存到 SD 卡,并且需要 SD 卡存在。每个设备上的用户交互也不同。
方法 2 的问题是稳定性。我尝试了一些示例,但我设法阻止相机在某些设备上工作(直到重新启动)并完全卡住另一台设备。在另一台设备上捕获成功,但预览仍然是黑色的。
我会使用 ZXing 作为示例应用程序(我经常使用它),但它只使用预览(取景器),不拍照。我还发现,在某些设备上,ZXing 没有在光照条件发生变化时自动调整白平衡,而原生相机应用可以正常调整(不确定是否可以修复)。
更新:
有一段时间我直接使用相机 API。这提供了更多控制(自定义 UI 等),但我不会向任何人推荐它。我会在 90% 的设备上工作,但时不时会发布新设备,但会遇到不同的问题。
我遇到的一些问题:
- 处理自动对焦
- 处理闪光灯
- 支持带有前置摄像头、后置摄像头或两者的设备
- 每台设备都有不同的屏幕分辨率、预览分辨率(并不总是与屏幕分辨率匹配)和图片分辨率的组合。
所以总的来说,我不建议走这条路,除非没有其他办法。两年后,我放弃了自定义代码并切换回基于 Intent 的方法。从那以后,我遇到的麻烦少了很多。我过去在基于 Intent 的方法中遇到的问题可能只是我自己的无能。
如果你真的需要走这条路,我听说如果你只支持 Android 4.0+ 的设备会容易得多。
最佳答案
With approach 2 the issues is stability. I tried some examples, but I've managed to stop the camera from working (until a restart) on some devices and completely freeze another device. On another device the capture worked, but the preview stayed black.
示例中存在错误或设备存在兼容性问题。
关于android - Android 上的相机示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8449414/