我几天以来一直在为我的应用程序使用CAMERA模块。 我已经定制了完整的相机模块,而不是通过意图调用硬件内置的移动相机。我用过快门,图片等的回叫 现在我正在尝试将ZOOM和AUTO-FOCUS功能添加到此自定义相机中。任何人都可以告诉我添加ZOOM和AUTO-FOCUS功能的方法以及清单文件中应该提到的所需权限。希望我能尽快得到帮助。
答案 0 :(得分:6)
我最后的一些观察结果。
1) Camera.autoFocus
是一次性通话,适用时
Camera.getParameters.getFocusMode()
是FOCUS-MODE-AUTO
或。FOCUS-MODE-MACRO
autoFocus
,在其他情况下,您不需要调用
AutoFocusCallback
方法。请参阅API文档并专心关注它们。
2)通过一次性调用,意味着此方法不会注册
FOCUS-MODE-AUTO
实例持续接收通知。
3)相反,FOCUS-MODE-EDOF
甚至不是一个动态和持续的焦点
不变。相反,您可能希望使用FOCUS-MODE-CONTINUOUS-PICTURES
或
FOCUS-MODE
取决于API级别和
您正在使用和构建的SDK版本。
4)有每一个
实际的设备相机可能不支持某些可能性
EDOF
常量,例如INFINITE
或getSupportedFocusModes
。始终确保
在创建摄像机参数时,请检查
camera.autoFocus
并使用适用的常量。
5)致电
camera.takePicture
之前的PictureCallBack
可能会膨胀
导致autoFocus()
中的jpeg-byte-array至少达到50%
超过它的原始尺寸。不明确地调用autoFocus()
可能
有时导致之前的BitmapFactory
结束
低分辨率可能导致jpeg-byte-array长度仅为a
10K字节,产生ZoomChangeListener
的空图像位图。
6)关于自动对焦权限,请参阅API文档。
7)关于
缩放,它没有实现自动对焦那么复杂
特征。取决于屏幕交互,例如滑块或硬件
诸如音量键之类的键,您可以实现Camera
您可以在Camera
实例后立即注册open(int cameraId)
是从{{1}}收到的。
答案 1 :(得分:3)
缩放(2x):
Camera.Parameters parameters = camera.getParameters();
parameters.set("zoom", "2.0");
parameters.set("taking-picture-zoom", "20");
对于api级别> 5使用类似setZoom()等的api
用于自动聚焦(取自zxing)
public final boolean onKeyDown(int keyCode, KeyEvent event) {
synchronized(this) {
if (!bIsPictureTaking) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_CAMERA) {
if (!bIsPictureTaking && !bIsAutoFocusStarted){
YourAutoFocusCallback autoFocusCallBack = new YourAutoFocusCallback();
camera.autoFocus(autoFocusCallBack);
final class YourAutoFocusCallback implements Camera.AutoFocusCallback {
private static final long AUTOFOCUS_INTERVAL_MS = 1500L;
private final CameraConfigurationManager configManager;
private boolean reinitCamera;
private Handler autoFocusHandler;
private int autoFocusMessage;
AutoFocusCallback(CameraConfigurationManager configManager) {
this.configManager = configManager;
}
void setHandler(Handler autoFocusHandler, int autoFocusMessage) {
this.autoFocusHandler = autoFocusHandler;
this.autoFocusMessage = autoFocusMessage;
}
public void onAutoFocus(boolean success, Camera camera) {
if (autoFocusHandler != null) {
Message message = autoFocusHandler.obtainMessage(autoFocusMessage, success);
autoFocusHandler.sendMessageDelayed(message, AUTOFOCUS_INTERVAL_MS);
autoFocusHandler = null;
configManager.setDesiredCameraParameters(camera);
} else {
}
}
}