`

自己封装的支持自动对焦的CameraView

阅读更多

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Date;

import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.os.Build;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
		Camera.AutoFocusCallback, Camera.PictureCallback {

	private TakePictureListener mListener;

	/**
	 * This is a holder that holding a display surface.
	 */
	private SurfaceHolder mHolder = null;

	private int sdk = 3;

	/**
	 * This is a camera object using for connect/disconnect with the camera
	 * service,and so on.
	 */
	private Camera mCamera;

	/**
	 * Perform inflation from XML and apply a class-specific base style. This
	 * constructor of View allows subclasses to use their own base style when
	 * they are inflating.
	 * 
	 * @param context
	 *            The Context the view is running in, through which it can
	 *            access the current theme, resources, etc.
	 * @param attrs
	 *            The attributes of the XML tag that is inflating the view.
	 * @param defStyle
	 *            The default style to apply to this view. If 0, no style will
	 *            be applied (beyond what is included in the theme). This may
	 *            either be an attribute resource, whose value will be retrieved
	 *            from the current theme, or an explicit style resource.
	 */
	public CameraView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	/**
	 * Constructor that is called when inflating a view from XML. This is called
	 * when a view is being constructed from an XML file, supplying attributes
	 * that were specified in the XML file. This version uses a default style of
	 * 0, so the only attribute values applied are those in the Context's Theme
	 * and the given AttributeSet.
	 * 
	 * @param context
	 *            The Context the view is running in, through which it can
	 *            access the current theme, resources, etc.
	 * @param attrs
	 *            The attributes of the XML tag that is inflating the view.
	 */
	public CameraView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	/**
	 * Simple constructor to use when creating a view from code.
	 * 
	 * @param context
	 *            The Context the view is running in, through which it can
	 *            access the current theme, resources, etc.
	 */
	public CameraView(Context context) {
		super(context);
		init();
	}

	public void init() {
		if (mHolder == null) {
			mHolder = getHolder();
			mHolder.addCallback(this);
			mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

			sdk = getSDKInt();
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

		try {

			// rotate camera 90 degree on portrait mode
			if (getContext().getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {

				if (sdk <= 4) {

					// 1.5 & 1.6
					Camera.Parameters parameters = mCamera.getParameters();
					parameters.set("orientation", "portrait");
					mCamera.setParameters(parameters);
				} else {
					setDisplayOrientation(mCamera, 90);
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		startPreview();
	}

	/**
	 * rotate camera with any degree, only available for SDK 5 and later
	 * 
	 * @param camera
	 * @param angle
	 */
	private void setDisplayOrientation(Camera camera, int angle) {
		Method downPolymorphic;

		if (sdk <= 4)
			return;

		try {
			if (sdk > 4 && sdk < 8) {

				// parameters for pictures created by a Camera service.
				Camera.Parameters parameters = mCamera.getParameters();

				// 2.0, 2.1
				downPolymorphic = parameters.getClass().getMethod(
						"setRotation", new Class[] { int.class });
				if (downPolymorphic != null)
					downPolymorphic.invoke(parameters, new Object[] { angle });

				// Sets the Parameters for pictures from this Camera
				// service.
				mCamera.setParameters(parameters);

			} else {

				downPolymorphic = camera.getClass().getMethod(
						"setDisplayOrientation", new Class[] { int.class });
				if (downPolymorphic != null)
					downPolymorphic.invoke(camera, new Object[] { angle });
			}
		} catch (Exception e) {
		}
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {

		// get Camera object.
		try {
			mCamera = Camera.open();
			mCamera.setPreviewDisplay(holder);

		} catch (RuntimeException e) {
			e.printStackTrace();
			releaseCamera();
		} catch (IOException e) {
			e.printStackTrace();
			releaseCamera();
		}
	}

	public void stopPreview() {
		releaseCamera();
	}

	public void startPreview() {
		if (mCamera != null) {
			mCamera.startPreview();
			mCamera.autoFocus(this);
		}
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		releaseCamera();
	}

	private void releaseCamera() {
		if (mCamera != null) {
			mCamera.stopPreview();
			mCamera.release();
		}
		mCamera = null;
		System.gc();
	}

	private int getSDKInt() {
		// this is safe so that we don't need to use SDKInt which is only
		// available after 1.6
		try {
			return Integer.parseInt(Build.VERSION.SDK);
		} catch (Exception e) {
			return 3; // default to target 1.5 cupcake
		}
	}

	@Override
	public void onAutoFocus(boolean success, Camera camera) {
		if (success)
			mCamera.takePicture(null, null, this);
	}

	@Override
	public void onPictureTaken(byte[] data, Camera camera) {

		if (mListener != null) {

			Bitmap cameraBitmap = BitmapFactory.decodeByteArray(data, 0,
					data.length);
			} catch (Exception e) {
				e.printStackTrace();
			}

			mListener.onTakePicture(cameraBitmap);
		}

		startPreview();
	}

	public void setTakePictureListener(TakePictureListener listener) {
		mListener = listener;
	}

	public interface TakePictureListener {

		public void onTakePicture(Bitmap bitmap);
	}
}
分享到:
评论
1 楼 Goro 2012-07-12  
帅!

相关推荐

    labview自动对焦实现

    在"labview自动对焦实现"这个项目中,我们聚焦于利用LabVIEW 2019来构建一个自动对焦系统,该系统能够调整相机的焦距以达到最佳的图像清晰度。以下是对每个文件的详细解释: 1. **视觉-自动对焦.lvclass**:这是一...

    OV5640自动对焦摄像头用户手册

    ### OV5640自动对焦摄像头用户手册关键知识点解析 #### 一、产品概述 OV5640是一款采用1/4英寸彩色CMOS QSXGA(5百万像素)图像传感器的产品,集成了OmniBSI™技术,旨在提供高清晰度的成像效果。该传感器特别适用...

    摄像头自动对焦马达芯片DW9714数据手册

    ### 摄像头自动对焦马达芯片DW9714数据手册解析 #### 一、概述 本文档旨在详细介绍DW9714这款10位分辨率的VCM(Voice Coil Motor)驱动集成电路(IC),它具备I²C接口,并专为摄像头自动对焦系统设计。该芯片支持...

    安森美推出全功能用于手机相机模块自动对焦控制器

    封装和价格方面,LC898214XC采用了无铅、无卤化的WLCSP-8封装,每4,000片的单价为0.88美元,这一经济实惠的价格策略,使得该产品更具市场竞争力,进一步推动了自动对焦技术的普及。封装的小巧设计也使得智能手机制造...

    软件自动安装器,可自由编辑,自动安装软件,可用于系统封装

    此外,自动安装器还可能支持静默安装模式,即在后台运行且不显示任何用户界面,进一步简化流程。 “可用于系统封装”表明这个自动安装器适用于创建预装有各种软件的操作系统镜像。系统封装是将一个已经配置好的系统...

    安捷伦推出数码相机自动对焦LED 亮度达18堪

    据称这是目前市场上亮度、封装尺寸的自动对焦LED,在20mA时的标准输出为18堪(candela),尺寸为4.8×4.8mm。 传统的相机通常使用红外线二极管(IR LED)作为弱光环境下的自动对焦光源,因为只有IR LED才能提供这类...

    OV5640应用笔记(MIPI接口)

    OV5640自动对焦摄像头应用笔记(MIPI接口)

    Cadence Allegro封装自动生成工具FPM最新版

    在这个最新的FPM(封装自动生成工具)版本中,Cadence进一步提升了封装设计的自动化程度,使得工程师们能够更快速、更精确地创建和管理封装库。 封装在电子设计中扮演着至关重要的角色,它是连接物理世界和电路板...

    封装后一键加域CMD批处理脚本

    今天,我们将深入探讨一款特别的脚本——“封装后一键加域CMD批处理脚本”,以及它如何通过自动化流程改善计算机部署。 在企业网络架构中,域的概念至关重要。域允许IT管理员集中管理用户账户、访问权限、软件分配...

    传感技术中的安捷伦推出数码相机自动对焦LED 亮度达18堪

    传感技术在数码相机领域的发展取得了重大突破,其中安捷伦(Agilent)推出的ASMT-FJ10自动对焦LED引领了这一领域的创新。这款LED专为数码相机在低光照条件下的自动对焦功能设计,提供了前所未有的亮度性能,不仅在技术...

    安捷伦为数码相机推出小体积自动对焦辅助LED闪光灯..

    标题提及的安捷伦科技有限公司推出的ASMT-FJ10是一款专为数码相机设计的小体积自动对焦辅助LED闪光灯,旨在改善弱光环境下的摄影体验。这款LED具有极高的亮度,是市场上亮度最高的自动对焦LED之一。在20毫安的电流下...

    Allegro封装自动生成

    5. 参数化设计:为了提高效率,Allegro支持参数化封装设计。通过定义参数,可以快速创建一系列相似的封装,只需要更改几个关键参数即可。 6. 设计规则检查(DRC):在封装完成后,需要进行DRC检查,确保封装符合...

    Allegro Skill封装创建工具

    本工具基于Cadence公司的Allegro Skill语言开发,目标是帮忙封装工具是快速、准确地创建大型...该工具的收益是节省了封装工程师创建封装的时间,全自动化减少了封装出错的可能性,同时也节省了硬件工程师复查封装的时间

    某站8000元APP封装系统源码app误报毒app可上传+自动实现5分钟随机更换包名和签名+视频安装教程

    某站8000元APP封装系统源码app误报毒app可上传+自动实现5分钟随机更换包名和签名+视频安装教程 2022-07-10 永久尊享 55 推广 PS 本源码提供给大家学习研究借鉴美工之用,请勿用于商业和非法用途,无任何技术支持! ...

    封装系统,自动删除c:\drivers文件夹

    封装系统,自动删除c:\drivers文件夹.可将此文件放在除SYSPREP文件夹以外的任何地方,在封装工具中首次进系统运行此文件,就能删除c:\drivers文件夹,完成后自动删除自身,所以不用再进行删除此文件的步骤.

    系统封装首席执行官SC封装2.0+工具

    1. **自动化安装**:SC封装2.0能够自动执行系统的预配置工作,如驱动安装、软件部署、系统优化等,大大减少了手动操作的时间和出错率。 2. **定制化设置**:用户可以根据自己的需求,定制封装后的系统包含的应用...

    c++封装好的支持Http/https类,包含dll/lib

    本主题聚焦于一个C++封装好的类库,它支持HTTP和HTTPS协议,能够实现GET和POST请求,同时具备文件的下载和上传功能。 标题中的"cpp封装好的支持Http/https类"意味着这个类库是用C++编写的,并且已经完成了对HTTP和...

    最新运营级一键IOS免签分发系统源码下载 带绿标+支持在线封装app.zip

    最新运营级一键IOS免签分发系统源码下载 带绿标+支持在线封装app 【运营版】的在线IOS免签封包分发平台,一键IOS免签,支持在线 封装app的分发系统源码,所有功能可进行二次开发, 基于目前主流的分发平台系统二开而...

    VBA代码封装助手 快速封装

    VBA代码封装助手通过提供自动化工具和模板,使得这个过程变得更加简单。 该工具可能包含以下功能: 1. **代码模板库**:预设了一些常用的VBA代码片段,用户可以通过选择合适的模板快速插入到当前的VBA项目中。 2. *...

Global site tag (gtag.js) - Google Analytics