Android调用摄像头取像

思路:利用Camera和SurfaceHolder

步骤
**

1.创建布局文件,初始化控件

**
利用SurfaceView进行相机预览

  <SurfaceView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/sv_camera"/>

在Activity中初始化控件,注意与SurfaceView一起使用的还有SurfaceHolder

    private void initViews(){//初始化控件
        mSurfaceView=findViewById(R.id.sv_camera);
        mSurfaceHoder=mSurfaceView.getHolder();
        mSurfaceHoder.addCallback(this);//添加回调接口,这一句很重要,一定要添加
    }

**

2.调用摄像头

**
需要注意的是,摄像头有2个,前置摄像头和后置摄像头。
不同的机型,对应的摄像头ID可能不一样,以我的为例。

     private Camera mCamera;
    private final int CAMERA_FRONT=1;//前置摄像头
    private final int CAMERA_BEHIND=0;//后置摄像头

**

3.在对应的Activity实现SurfaceHolder.CallBack

**

public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback

实现这个接口的方法

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
 //SurfaceView创建时调用
}
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    //SurfaceView发生改变时调用
    }
  @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        //SurfaceView销毁时调用
    }

4.初始化摄像头
使用Camera.open()方法打开摄像头

Camera camera;
camera=Camera.open(CAMERA_NOW);//默认打开后置摄像头
mCamera.setDisplayOrientation(90);//安卓默认是横屏,旋转转为90度,转为竖屏
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();

还要写释放Camera的方法,这个最好写,不然可能其它程序调用的时候容易被占用

public void releaseCamera(){
        mCamera.stopPreview();
        if(mCamera==null){
           return;
        }
        mCamera.release();
        mCamera=null;
        mSurfaceHoder=null;
    }

完整的代码:

package com.magic.myfacecamera;

import android.hardware.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

import java.io.IOException;

public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback{
    private static final String TAG="CameraActivity";

    private Camera mCamera;
    private final int CAMERA_FRONT=1;//前置摄像头
    private final int CAMERA_BEHIND=0;//后置摄像头
    private int CAMERA_NOW=CAMERA_BEHIND;//默认打开后置摄像头


    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHoder;



    /////////////////////////////创建时/////////////////////////////////
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);

        initViews();
    }

    private void initViews(){//初始化控件
        mSurfaceView=findViewById(R.id.sv_camera);
        mSurfaceHoder=mSurfaceView.getHolder();
        mSurfaceHoder.addCallback(this);//添加回调接口
    }

    public Camera getCamera(){//初始化摄像头
        Camera camera;
            try {
                camera=Camera.open(CAMERA_NOW);//默认打开后置摄像头
                return camera;
            }catch (Exception e){
                Log.i(TAG,"open camera failed");
                e.printStackTrace();
            }
            return null;
    }

    public void startPreview(Camera camera,SurfaceHolder surfaceHolder){
        if(camera==null){
            mCamera=getCamera();
        }else{
            mCamera=camera;
        }

        if(surfaceHolder==null){
            surfaceHolder=mSurfaceView.getHolder();
        }

        try {
            mCamera.setDisplayOrientation(90);//安卓默认是横屏,旋转转为90度,转为竖屏
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //创建时开始预览
        startPreview(mCamera,mSurfaceHoder);
    }

    //////////////////////////////改变时/////////////////////////////////
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }


    ////////////////////////////暂停时////////////////////////////////////

    @Override
    protected void onPause() {
        super.onPause();
    }

    /////////////////////////////恢复时///////////////////////////////////

    @Override
    protected void onResume() {
        super.onResume();
    }

    ////////////////////////////销毁时////////////////////////////////////
    public void releaseCamera(){
        mCamera.stopPreview();
        if(mCamera==null){
           return;
        }
        mCamera.release();
        mCamera=null;
        mSurfaceHoder=null;
    }
    @Override
    protected void onDestroy() {
        releaseCamera();
        super.onDestroy();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        releaseCamera();
    }
    }
}

你可能感兴趣的:(android)