今天用到了调用摄像头
因为昨天不是在surfaceview上使用画布,而是使用摄像头
这里就总结自己代码和各位大牛的经验吧
使用摄像头 调用Camera要做的几个点分别是
设置尺寸、调整焦距、设置旋转角度
一开始先声明属性

    private SeekBar seekBar;        //进度条调整焦距
private ImageView add,minus; //按钮调整焦距
private boolean haveCamera; //是否有相机设备
private int mCurrentCamIndex; //相机的指数
private int ROTATE; //旋转值
private int minFocus; //当前手机默认的焦距
private int maxFocus; //当前手机的最大焦距
private int everyFocus; //用于调整焦距
private int nowFocus; //当前的焦距值

private Camera camera;

使用getPackageManager().hasSystemFeature的方法查看是否有摄像头设备

 private boolean checkCameraHadware(){
if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA))
return true;
else return false;
}

打开前置摄像头的方法,先确定摄像头的个数,然后获取前置摄像头的id
用mCamera = android.hardware.Camera.open(camIdx)得到摄像头然后返回它

 private android.hardware.Camera openFrontFacingCameraGingerbread(){
int cameraCount; //摄像头个数
Camera mCamera = null; //声明相机变量
Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); //创建相机对象
cameraCount = android.hardware.Camera.getNumberOfCameras();
for(int camIdx = 0 ; camIdx < cameraCount ; camIdx++){
Camera.getCameraInfo(camIdx,cameraInfo); //获取相机对象
//判断是否前置摄像头
if(cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
try{
mCamera = android.hardware.Camera.open(camIdx); //打开前置摄像头
mCurrentCamIndex = camIdx; //设置前置摄像头id
}catch (RuntimeException e){
Log.e(TAG,"相机打开失败:" + e.getLocalizedMessage());
}
}
}
return mCamera;
}

设置旋转角度

 private void setCameraDisplayOrientation(Activity activity,int cameraId,Camera camera){
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId,info);
//获得旋转角度
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: //没有旋转
degrees = 0;
break;
case Surface.ROTATION_90: //旋转90°
degrees = 90;
break;
case Surface.ROTATION_180: //180
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}

int result = 0;
if(info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
//前置摄像头旋转算法
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;
}else{
result = (info.orientation - degrees + 360) % 360;
}
ROTATE = result + 180;
camera.setDisplayOrientation(result); //设置拍摄角度
}

然后设置焦距和打开的竖屏横屏

 private void setCamera(){
if(checkCameraHadware()){
camera = openFrontFacingCameraGingerbread();
//设置摄像头方向调整摄像头旋转90度,成竖屏
setCameraDisplayOrientation(this,mCurrentCamIndex,camera);
Camera.Parameters parameters = camera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);
List<String> list= parameters.getSupportedFocusModes(); //获取支持的对焦格式
for(String str : list){
Log.e(TAG,"支持的对焦模式:"+ str );
}
//手机支持的图片尺寸合集
List<Camera.Size> pictureList = parameters.getSupportedPictureSizes();
//手机支持的预览尺寸集合
List<Camera.Size> previewList = parameters.getSupportedPreviewSizes();
//设置为当前使用手机的最大尺寸
parameters.setPictureSize(pictureList.get(0).width,pictureList.get(0).height);
minFocus = parameters.getZoom(); //获得最小焦距
maxFocus = parameters.getMaxZoom();
everyFocus = 1; //每次增加及减少值
nowFocus = minFocus; //当前焦距为最小值
seekBar.setMax(maxFocus); //设置最大焦距
Log.e(TAG,"当前镜头距离:" + minFocus + "\t\t获取最大距离:" + maxFocus); //日志打印
camera.setParameters(parameters);

}
}

最后在surfaceview上打开摄像头
使用了 camera.setPreviewDisplay(holder)来打开
camera.setPreviewCallback(null)、 camera.stopPreview()来关闭

  @Override
public void surfaceCreated(SurfaceHolder holder) {
Log.e("surfaceCreated","绘制开始");
try{
setCamera();
camera.setPreviewDisplay(holder);
} catch (IOException e) {
camera.release();
camera = null;
e.printStackTrace();
}
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.e("surfaceChanged","绘制改变");
try{
camera.stopPreview();
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.e("surfaceDestroyed","绘制结束");
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera = null;
}

还有其中对seekbar和buttom的调焦操作

//设置相机参数
private void setZoomValues(int want){
Camera.Parameters parameters = camera.getParameters(); //获得相机参数
seekBar.setProgress(want); //设置进度
parameters.setZoom(want); //设置焦距参数
camera.setParameters(parameters); //设置相机参数,焦距
}

//获取相机参数和当前焦距
private int getZoomValues(){
Camera.Parameters parameters = camera.getParameters();
int values = parameters.getZoom();
return values;
}

//调节焦距
//添加
private void addZoomValues(){
if(nowFocus > maxFocus){
Log.e(TAG,"大于maxFocus是不可能的");
}else if(nowFocus == maxFocus){
}else {
setZoomValues(getZoomValues() + everyFocus);
}
}

//缩小
private void minusZoomValues(){
if(nowFocus < minFocus){
Log.e(TAG,"小于minFocus是不可能的");
}else if(nowFocus == minFocus){
}else {
setZoomValues(getZoomValues() - everyFocus);
}
}

public void onProgressChanged(SeekBar seekBar,int progress,boolean fromUser){
Camera.Parameters parameters = camera.getParameters();
nowFocus = progress;
parameters.setZoom(progress);
camera.setParameters(parameters);
}
public boolean onTouch(View v, MotionEvent event){
switch (v.getId()){
case R.id.add:
addZoomValues(); //放大焦距
break;
case R.id.minus:
minusZoomValues(); //缩小焦距
break;
case R.id.picture:
break;
default:
break;
}
return true;
}