代码系列2:Camera的简单应用


public class MainActivity extends Activity implements SurfaceHolder.Callback, PictureCallback, OnClickListener, AutoFocusCallback {
	private static final int AUTO_FOCUS = 0;
	private static Camera sCamera;
	private SurfaceView mSurfaceView;
	private SurfaceHolder mSurfaceHolder;
	private Button mButton;
	private Handler mHandler;
	private boolean mIsAutoFocus;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		init();
	}

	@SuppressWarnings("deprecation")
	void init() {
		mIsAutoFocus = true;
		mHandler = new AutoFocusHandler();
		mSurfaceView = (SurfaceView) findViewById(R.id.preview);
		mButton = (Button) findViewById(R.id.capture);
		mButton.setOnClickListener(this);
		mSurfaceHolder = mSurfaceView.getHolder();
		mSurfaceHolder.addCallback(this);
		mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	public void surfaceCreated(SurfaceHolder holder) {
		sCamera = Camera.open();
		try {
			sCamera.setPreviewDisplay(holder);
			setDisplayOrientation(sCamera, 90);
			sCamera.startPreview();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		sCamera.autoFocus(this);
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		sCamera.release();
		sCamera = null;
	}

	protected void setDisplayOrientation(Camera camera, int angle) {
		Method setOrientation;
		try {
			setOrientation = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
			if (setOrientation != null)
				setOrientation.invoke(camera, new Object[] { angle });
		} catch (Exception e1) {
		}
	}

	public void onPictureTaken(byte[] data, Camera camera) {
		startActivity(data);
	}

	public void onClick(View v) {
		mIsAutoFocus = false;
		sCamera.takePicture(null, null, null, this);
	}

	public void onAutoFocus(boolean success, Camera camera) {
		if (mIsAutoFocus) {
			mHandler.sendEmptyMessageDelayed(AUTO_FOCUS, 1500);
		}
	}

	@SuppressLint("HandlerLeak")
	class AutoFocusHandler extends Handler {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case AUTO_FOCUS:
				sCamera.autoFocus(MainActivity.this);
				break;

			default:
				break;
			}
		}
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高通CamX与OpenCamera是两个不同的概念,CamX是高通公司的相机框架,而OpenCamera是一个开源的Android相机应用。因此,它们之间的代码流程是不同的。以下是OpenCamera的基本代码流程: 1. 初始化相机:OpenCamera会初始化相机设备,包括打开相机设备、配置相机参数(如分辨率、帧率、对焦模式等)。 2. 设置预览界面:OpenCamera会创建一个预览界面(SurfaceView或TextureView),用于显示相机预览画面。 3. 实现相机功能:OpenCamera实现了一系列的相机功能,如自动对焦、曝光调节、白平衡控制等。这些功能通过调用相机API来实现。 4. 拍照和录像:OpenCamera提供了拍照和录像功能。当用户点击拍照按钮时,OpenCamera会触发拍照操作,并保存照片到指定路径。而在录像模式下,OpenCamera会开始录制视频,并保存到指定路径。 5. 处理图像数据:OpenCamera在预览和拍照/录像过程中,会获取相机输出的图像数据,并进行处理。这可能包括图像增强、实时滤镜、人脸识别等操作。 6. 相机参数设置:OpenCamera还提供了一些相机参数的设置,如闪光灯模式、场景模式、ISO设置等。 7. 监听相机事件:OpenCamera会监听相机事件,如对焦完成、曝光完成等,以便在相应事件发生时作出相应的处理。 8. 释放相机资源:当不再需要使用相机时,OpenCamera会释放相机资源,包括关闭相机设备、释放预览界面等。 总的来说,OpenCamera代码流程包括初始化相机、设置预览界面、实现相机功能、拍照和录像、处理图像数据、相机参数设置、监听相机事件和释放相机资源。这样就可以实现一个基本的相机应用程序。请注意,这只是一个简单的概述,实际的代码流程可能更加复杂和详细。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值