需求: 预览摄像头,并实现前后摄像头切换
实现:集成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" />
(三)将会实现前后摄像头的拍照!