利用摄像头摄像或拍照(二)

需求: 预览摄像头,并实现前后摄像头切换

实现:集成Surface,并通过Camera.open(0)和Camera.open(1)来启动后置和前置摄像头

代码如下:

ShowView.java类用来显示预览界面

package com.davidtao.camerashooting;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.Toast;
/**
 * 
 * @author DavidTao
 *
 */
public class ShowView extends Activity implements OnClickListener{
	
	/** 相机*/
	private Camera mCamera;
	
	private Context mContext;
	
	private CameraView mCameraView;
	
	/** 当前相机信息*/
	private CameraInfo mCameraInfo;
	
	/** 放置预览界面*/
	private FrameLayout mFrameLayout;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mContext = this;
		
		/** 没有标题栏*/
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		
		/** 设置横屏*/
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
		setContentView(R.layout.camera_view);
		
		if(initCamera()) {
			/** 厨师话相机预览界面*/
			mCameraView = new CameraView(mContext, mCamera);
			mFrameLayout = (FrameLayout) findViewById(R.id.camera);
			/** 加载界面*/
			mFrameLayout.addView(mCameraView);
			mFrameLayout.setOnClickListener(this);
		}
	}
	
	/**
	 * 需要捕捉异常,当摄像头正在被占用的时候,会抛出异常
	 */
	private boolean initCamera() {
		try {
			mCameraInfo =new CameraInfo();
			/** 0默认为后置摄像头,获取后置摄像头的信息 */
			Camera.getCameraInfo(0, mCameraInfo);
			/** 开启后置摄像头*/
			mCamera = Camera.open(0);
			return true;
		} catch(Exception e) {
			e.printStackTrace();
			Toast.makeText(mContext, "摄像头正在被占用", Toast.LENGTH_LONG).show();
			Intent intent = new Intent(mContext, MainActivity.class);
			startActivity(intent);
		}
		return false;
	}
	
	@Override
	public void onBackPressed() {
		mCamera.stopPreview();
		mCamera.release();
		mCamera = null;
		super.onBackPressed();
	}

	@Override
	public void onClick(View v) {
		if (v.getId() == R.id.camera) {
			/** 停止预览*/
			mCamera.stopPreview();
			/** 释放资源*/
			mCamera.release();
			mCamera = null;
			if (mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
				/** 若原来是打开的后置摄像头,现在打开前置摄像头*/
				mCamera = Camera.open(1);
				/** 获取前置摄像头的信息*/
				Camera.getCameraInfo(1, mCameraInfo);
				
			} else {
				/** 若原来是打开的前置摄像头,现在打开后置摄像头*/
				mCamera = Camera.open(0);
				/** 获取后置摄像头的信息*/
				Camera.getCameraInfo(0, mCameraInfo);
			}
			mCameraView = new CameraView(mContext, mCamera);
			/** 删除原有View*/
			mFrameLayout.removeAllViews();
			/** 重新加载新的View*/
			mFrameLayout.addView(mCameraView);
		}
	}
}


CameraView.java用来初始化预览界面VIew:

package com.davidtao.camerashooting;

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
 * 预览界面初始化
 * @author DavidTao
 *
 */
public class CameraView extends SurfaceView implements SurfaceHolder.Callback{

	private SurfaceHolder mSurfaceHolder;
	
	private Camera mCamera;
	
	public CameraView(Context context, Camera camera) {
		super(context);
		mCamera = camera;
		
		mSurfaceHolder = getHolder();
		mSurfaceHolder.addCallback(this);
		/** 若版本低于3.0,,还需要设置type*/
		mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}
	
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub
		
	}
	
	/**
	 * 创建surface,将holder的对象传给Camera
	 */
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		try {
			mCamera.setPreviewDisplay(mSurfaceHolder);
			mCamera.startPreview();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		
	}	


}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <FrameLayout 
        android:id="@+id/camera"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
</FrameLayout>


需要权限:

<uses-permission android:name="android.permission.CAMERA" />


这样,就可以实现前后摄像头的预览和切换。

(三)将会实现前后摄像头的拍照!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值