package com.yssh.myapplication;
import android.app.Activity;
import android.hardware.Camera;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MainActivity extends Activity implements SurfaceHolder.Callback{
private SurfaceView mCameraView; // 视频显示控件
private SurfaceHolder currentHolder = null;
private boolean mIsSufaceCreated = false;
private Camera mCamera;
private Camera.Size mSize;
public final int CAMERA_FACING_BACK = 0; // 0代表前置摄像头
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.video_frame);
mCameraView = (SurfaceView) findViewById(R.id.surface_local);
currentHolder = mCameraView.getHolder();// 取得holder
currentHolder.addCallback(this); // holder加入回调接口
// // setType必须设置,要不出错.
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB){
currentHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
releaseCamera();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
releaseCamera();
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
initCamera();
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
mIsSufaceCreated = true;
currentHolder = arg0;
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
mIsSufaceCreated = false;
}
private void initCamera() {
//保证只有一个Camera对象
if (mCamera != null || !mIsSufaceCreated) {
return;
}
try{
mCamera = Camera.open(CAMERA_FACING_BACK);
CameraSizeComparator sizeComparator = new CameraSizeComparator();
Camera.Parameters parameters = mCamera.getParameters();
if (mSize == null) {
List<Camera.Size> vSizeList = parameters.getSupportedPreviewSizes();
Collections.sort(vSizeList, sizeComparator);
for (int num = 0; num < vSizeList.size(); num++) {
Camera.Size size = vSizeList.get(num);
if (size.width >= 800 && size.height >= 480) {
this.mSize = size;
break;
}
}
mSize = vSizeList.get(0);
List<String> focusModesList = parameters.getSupportedFocusModes();
//增加对聚焦模式的判断
if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
} else if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
mCamera.setParameters(parameters);
}
mCamera.setPreviewDisplay(currentHolder);
mCamera.startPreview();
}catch (Exception e){
Log.d("mCamera", e.getMessage());
e.printStackTrace();
}
}
private class CameraSizeComparator implements Comparator {
public int compare(Camera.Size lhs, Camera.Size rhs) {
if (lhs.width == rhs.width) {
return 0;
} else if (lhs.width > rhs.width) {
return 1;
} else {
return -1;
}
}
}
private void releaseCamera() {
try {
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.unlock();
mCamera.release();
}
} catch (RuntimeException e) {
} finally {
mCamera = null;
}
}
}