下面列出了怎么用android.hardware.Camera.AutoFocusCallback的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* Setups preview button to take a picture state.
*/
private void setPreviewForPicture() {
mPreview.setSoundEffectsEnabled(false);
mPreview.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mCamera.autoFocus(new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean arg0, Camera arg1) {
//TODO Is there anything we have to do after autofocus?
}
});
}
});
}
/**
* Resets camera parameters and starts camera preview.
*/
private void resetCam() {
try {
Camera.Parameters parameters = mCamera.getParameters();
logi("Set Flash mode ON");
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameters);
mCamera.startPreview();
mCamera.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
//TODO: add implementation or leave a comment if it's nothing to do here
}
});
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameters);
} catch(RuntimeException e) {
Log.e(TAG, e.toString());
}
}
/**
* 自动对焦
*
* @param cb
* @return
*/
public boolean autoFocus(AutoFocusCallback cb) {
if (camera != null) {
try {
camera.cancelAutoFocus();
if (mParameters != null) {
String mode = getAutoFocusMode();
if (StringUtils.isNotEmpty(mode)) {
mParameters.setFocusMode(mode);
camera.setParameters(mParameters);
}
}
camera.autoFocus(cb);
return true;
} catch (Exception e) {
if (mOnErrorListener != null) {
mOnErrorListener.onVideoError(MEDIA_ERROR_CAMERA_AUTO_FOCUS, 0);
}
if (e != null)
Log.e("Yixia", "autoFocus", e);
}
}
return false;
}
@SuppressWarnings("deprecation")
public CameraPreview(Context context, Camera camera, PreviewCallback previewCb, AutoFocusCallback autoFocusCb) {
super(context);
mCamera = camera;
previewCallback = previewCb;
autoFocusCallback = autoFocusCb;
/*
* Set camera to continuous focus if supported, otherwise use software
* auto-focus. Only works for API level >=9.
*/
/*
* Camera.Parameters parameters = camera.getParameters(); for (String f
* : parameters.getSupportedFocusModes()) { if (f ==
* Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) {
* mCamera.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
* autoFocusCallback = null; break; } }
*/
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@SuppressWarnings("deprecation")
public CameraPreview(Context context, Camera camera, PreviewCallback previewCb, AutoFocusCallback autoFocusCb) {
super(context);
mCamera = camera;
previewCallback = previewCb;
autoFocusCallback = autoFocusCb;
/*
* Set camera to continuous focus if supported, otherwise use software
* auto-focus. Only works for API level >=9.
*/
Camera.Parameters parameters = camera.getParameters();
for (String f: parameters.getSupportedFocusModes()) {
if (f == Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
autoFocusCallback = null;
break;
}
}
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void autoFocus(final Handler handler, final CameraAFCallback cb) {
final AutoFocusCallback afCallback = new AutoFocusCallback() {
@Override
public void onAutoFocus(final boolean b, Camera camera) {
if (mCameraState.getState() != AndroidCameraStateHolder.CAMERA_FOCUSING) {
Log.w(TAG, "onAutoFocus callback returning when not focusing");
} else {
mCameraState.setState(AndroidCameraStateHolder.CAMERA_IDLE);
}
handler.post(new Runnable() {
@Override
public void run() {
cb.onAutoFocus(b, AndroidCameraProxyImpl.this);
}
});
}
};
mDispatchThread.runJob(new Runnable() {
@Override
public void run() {
// Don't bother to wait since camera is in bad state.
if (getCameraState().isInvalid()) {
return;
}
mCameraState.waitForStates(AndroidCameraStateHolder.CAMERA_IDLE);
mCameraHandler.obtainMessage(CameraActions.AUTO_FOCUS, afCallback)
.sendToTarget();
}
});
}
/**
* 手动对焦
*
* @param focusAreas 对焦区域
* @return
*/
@SuppressLint("NewApi")
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public boolean manualFocus(AutoFocusCallback cb, List<Area> focusAreas) {
if (camera != null && focusAreas != null && mParameters != null && DeviceUtils.hasICS()) {
try {
camera.cancelAutoFocus();
// getMaxNumFocusAreas检测设备是否支持
if (mParameters.getMaxNumFocusAreas() > 0) {
// mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);//
// Macro(close-up) focus mode
mParameters.setFocusAreas(focusAreas);
}
if (mParameters.getMaxNumMeteringAreas() > 0)
mParameters.setMeteringAreas(focusAreas);
mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
camera.setParameters(mParameters);
camera.autoFocus(cb);
return true;
} catch (Exception e) {
if (mOnErrorListener != null) {
mOnErrorListener.onVideoError(MEDIA_ERROR_CAMERA_AUTO_FOCUS, 0);
}
if (e != null)
Log.e("Yixia", "autoFocus", e);
}
}
return false;
}
/**
* 手动聚焦
* @param point 触屏坐标
*/
protected void onFocus(Point point,AutoFocusCallback callback){
Parameters parameters=mCamera.getParameters();
//不支持设置自定义聚焦,则使用自动聚焦,返回
if (parameters.getMaxNumFocusAreas()<=0) {
mCamera.autoFocus(callback);
return;
}
List<Area> areas=new ArrayList<Area>();
int left=point.x-300;
int top=point.y-300;
int right=point.x+300;
int bottom=point.y+300;
left=left<-1000?-1000:left;
top=top<-1000?-1000:top;
right=right>1000?1000:right;
bottom=bottom>1000?1000:bottom;
areas.add(new Area(new Rect(left,top,right,bottom), 100));
parameters.setFocusAreas(areas);
try {
//本人使用的小米手机在设置聚焦区域的时候经常会出异常,看日志发现是框架层的字符串转int的时候出错了,
//目测是小米修改了框架层代码导致,在此try掉,对实际聚焦效果没影响
mCamera.setParameters(parameters);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
mCamera.autoFocus(callback);
}
@SuppressWarnings("deprecation")
public CameraPreview(Context context, Camera camera, PreviewCallback previewCb, AutoFocusCallback autoFocusCb) {
super(context);
mCamera = camera;
previewCallback = previewCb;
autoFocusCallback = autoFocusCb;
/*
* Set camera to continuous focus if supported, otherwise use software
* auto-focus. Only works for API level >=9.
*/
Camera.Parameters parameters = camera.getParameters();
for (String f: parameters.getSupportedFocusModes()) {
if (f == Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
autoFocusCallback = null;
break;
}
}
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(checkCameraHardware(this)){
// ��ȡ����ͷʵ��
mCamera = getCameraInstance();
// ����Ԥ������Ķ���
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
//��Ԥ���������Ϊ֡���ֵ��ӽڵ�
preview.addView(mPreview);
//��ȡ���հ�ť
Button captureButton = (Button) findViewById(R.id.button_capture);
//���õ������
captureButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
//�Զ��Խ�
mCamera.autoFocus(new AutoFocusCallback(){
//�Խ����ʱ����
@Override
public void onAutoFocus(boolean success,
Camera camera) {
//����
mCamera.takePicture(null, null, mPicture);
}
});
}
}
);
}
}
@SuppressWarnings("deprecation")
public CameraPreview(Context context, Camera camera, PreviewCallback previewCb, AutoFocusCallback autoFocusCb) {
super(context);
mCamera = camera;
previewCallback = previewCb;
autoFocusCallback = autoFocusCb;
/*
* Set camera to continuous focus if supported, otherwise use software
* auto-focus. Only works for API level >=9.
*/
/*
* Camera.Parameters parameters = camera.getParameters(); for (String f
* : parameters.getSupportedFocusModes()) { if (f ==
* Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) {
* mCamera.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
* autoFocusCallback = null; break; } }
*/
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}