几天以来,我一直在为我的应用程序使用 CAMERA 模块。我已经定制了完整的相机模块,而不是通过意图调用硬件内置的移动相机。我已经使用了快门、图片等的回调现在我正在尝试将 ZOOM 和 AUTO-FOCUS 功能添加到这个定制的相机中。任何人都可以让我知道添加缩放和自动对焦功能的方法以及清单文件中应该提到的所需权限..希望我能尽快得到帮助。
2 回答
我的一些观察结果。
1) Camera.autoFocus
是一次性调用,当
Camera.getParameters.getFocusMode()
isFOCUS-MODE-AUTO
或
时适用FOCUS-MODE-MACRO
,在其他情况下您不需要调用该
autoFocus
方法。请参阅 API 文档并认真关注它们。
2)一次性调用,表示该方法不注册
AutoFocusCallback
实例连续接收通知。
3)相反,FOCUS-MODE-AUTO
甚至不是动态和连续的焦点常数。相反,您可能希望使用FOCUS-MODE-EDOF
或
FOCUS-MODE-CONTINUOUS-PICTURES
依赖于您正在使用和构建的 API 级别和 SDK 版本。
4)实际的 Device Camera 很可能不支持某些
FOCUS-MODE
常量,例如EDOF
or INFINITE
。始终确保在创建相机参数时检查
getSupportedFocusModes
并使用适用的常量。
5)camera.autoFocus
之前调用
camera.takePicture
会使生成的 jpeg-byte-array 膨胀PictureCallBack
到至少比原始大小多 50%。不显式调用autoFocus()
有时可能会导致前autoFocus()
一个以非常低的分辨率结束,这可能会导致 jpeg-byte-array 长度仅为 10K 字节,从而导致BitmapFactory
.
6)关于自动对焦权限,请参阅 API Docs。
7)关于变焦,没有实现自动对焦功能那么复杂。根据诸如滑块之类的屏幕交互或诸如音量键之类的硬件键,您可以实现一个ZoomChangeListener
,您可以在从 接收到实例Camera
后立即向注册。Camera
open(int cameraId)
For zoom (2x):
Camera.Parameters parameters = camera.getParameters();
parameters.set("zoom", "2.0");
parameters.set("taking-picture-zoom", "20");
For api level > 5 use the api's like setZoom() etc
For autofocussing (taken from 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 {
}
}
}