Welcome

首页 / 移动开发 / Android / Android自定义相机实现自动对焦和手动对焦

Android自定义相机实现自动对焦和手动对焦:
不调用系统相机,因为不同的机器打开相机呈现的界面不统一也不能满足需求。
所以为了让程序在不同的机器上呈现出统一的界面,并且可以根据需求进行布局,做了此demo。

程序实现代码如下:

import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.lang.reflect.Method;import android.graphics.PixelFormat;import android.hardware.Camera;import android.hardware.Camera.AutoFocusCallback;import android.hardware.Camera.Parameters;import android.hardware.Camera.PictureCallback;import android.hardware.Camera.ShutterCallback;import android.os.Build;import android.os.Bundle;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.hp.classes.config.Constants;import com.hp.classes.tools.CommonUtils;import com.hp.classes.ui.BaseActivity;@SuppressWarnings("deprecation")public class PhotographActivity extends BaseActivity implements OnClickListener, SurfaceHolder.Callback {private SurfaceView surfaceView;private Camera camera;private Camera.Parameters parameters;private Button btn_goback, btn_takephoto;private SurfaceHolder surfaceHolder;@Overrideprotected void onDestroy() {super.onDestroy();if(camera != null){camera.stopPreview();camera.release();camera = null;}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.classes_activity_takephoto);initView();}@Overrideprotected void onResume() {super.onResume();initCamera();}private void initView(){btn_goback = (Button) findViewById(R.id.btn_goback);btn_goback.setOnClickListener(this);btn_takephoto = (Button) findViewById(R.id.btn_takephoto);btn_takephoto.setOnClickListener(this);surfaceView = (SurfaceView) findViewById(R.id.surfaceView);surfaceView.setFocusable(true);surfaceView.setOnClickListener(this);surfaceView.setBackgroundColor(TRIM_MEMORY_BACKGROUND);surfaceHolder = surfaceView.getHolder();surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);surfaceHolder.setKeepScreenOn(true);surfaceHolder.setFixedSize(400, 300);surfaceHolder.addCallback(this);}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubcamera.stopPreview();camera.release();camera = null;}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubtry {camera.setPreviewDisplay(surfaceHolder);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {// 实现自动对焦camera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {if (success) {camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦doAutoFocus();}}});}// 相机参数的初始化设置private void initCamera() {if (null == camera) {camera = Camera.open();}parameters = camera.getParameters();parameters.setPictureFormat(PixelFormat.JPEG);parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);if (!Build.MODEL.equals("KORIDY H30")) {parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦}else{parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);}camera.setParameters(parameters);setDispaly(camera);camera.startPreview();camera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上}// 控制图像的正确显示方向private void setDispaly(Camera camera) {if (Integer.parseInt(Build.VERSION.SDK) >= 8) {setDisplayOrientation(camera, -90);} else {parameters.setRotation(-90);}}// 实现的图像的正确显示private void setDisplayOrientation(Camera camera, int i) {Method downPolymorphic;try {downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });if (downPolymorphic != null) {downPolymorphic.invoke(camera, new Object[] { i });}} catch (Exception e) {Log.e("Came_e", "图像出错");}}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.surfaceView:doAutoFocus();break;case R.id.btn_takephoto:takePicture();break;case R.id.btn_goback:finish();break;default:break;}}// handle button auto focusprivate void doAutoFocus() {parameters = camera.getParameters();parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);camera.setParameters(parameters);camera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {if (success) {camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。if (!Build.MODEL.equals("KORIDY H30")) {parameters = camera.getParameters();parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦camera.setParameters(parameters);}else{parameters = camera.getParameters();parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);camera.setParameters(parameters);}}}});}private void takePicture() {camera.takePicture(shutterCallback, rawCallback, jpegCallback);}// define shutterCallbackShutterCallback shutterCallback = new ShutterCallback() {public void onShutter() {// TODO Do something when the shutter closes.}};PictureCallback rawCallback = new PictureCallback() {public void onPictureTaken(byte[] data, Camera camera) {// TODO Do something with the image RAW data.}};// stroe the picture in format jpegPictureCallback jpegCallback = new PictureCallback() {public void onPictureTaken(byte[] data, Camera camera) {// Save the image JPEG data to the SD cardFileOutputStream outStream = null;try {//修改图片路径和名称String tempFilename = String.valueOf(System.currentTimeMillis()) + ".jpg";File folder = Constants.CACHE_FOLDER;if (!folder.isDirectory()) {folder.mkdirs();}String path = Constants.CACHE_FOLDER + File.separator + tempFilename;outStream = new FileOutputStream(path);outStream.write(data);outStream.flush();outStream.close();surfaceView.setBackgroundDrawable(new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length)));} catch (FileNotFoundException e) {Log.e("TAG", "File Note Found", e);} catch (IOException e) {Log.e("TAG", "IO Exception", e);}}};}
classes_activity_takephoto.xml代码如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:layout_toLeftOf="@+id/rlright" /><LinearLayoutandroid:id="@+id/rlright"android:layout_width="40dp"android:layout_height="match_parent"android:layout_alignParentRight="true"android:background="#2b2b2b"android:gravity="center_horizontal"android:orientation="vertical" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="0dip"android:layout_weight="1"android:gravity="center" ><Buttonandroid:id="@+id/btn_goback"style="@style/PETextButton"android:text="返回"/></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="0dip"android:layout_weight="1"android:gravity="center" ><Buttonandroid:id="@+id/btn_takephoto"style="@style/PETextButton"android:text="拍照" /></LinearLayout></LinearLayout></RelativeLayout>
在清单文件需要添加相应权限:

<uses-permission android:name="android.permission.CAMERA"/><uses-feature android:name="android.hardware.camera"/><uses-feature android:name="android.hardware.camera.autofocus"/>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。