Camera与SurfaceView

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    private Camera mCamera;
    private SurfaceHolder surfaceHolder;
    public MySurfaceView(Context context){
        this(context,null);
    }
    public MySurfaceView(Context context, AttributeSet attrs){
        this(context,attrs,0);
    }
    public MySurfaceView(Context context, AttributeSet attrs,int defStyleAttr){
        super(context,attrs,defStyleAttr);
        surfaceHolder = getHolder();
        surfaceHolder.addCallback(this);
    }
    public void setCamera(Camera camera){
        mCamera = camera;
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPictureFormat(PixelFormat.JPEG); //图片格式
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); //对焦模式
        parameters.setRotation(90);
        mCamera.setParameters(parameters);
    }
    private void checkCamera(){
        if(mCamera == null){
            Toast.makeText(getContext(),"相机没有初始化",Toast.LENGTH_LONG).show();
            return;
        }
    }
    private void startPreView(SurfaceHolder holder){
        checkCamera();
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.setDisplayOrientation(90);
            mCamera.startPreview();
        }catch (Exception e){
            e.printStackTrace();
            Log.i("wanlijun",e.toString());
        }
    }
    private void stopPreView(){
        checkCamera();
        try {
            mCamera.stopPreview();
        }catch (Exception e){
            e.printStackTrace();
            Log.i("wanlijun",e.toString());
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.i("wanlijun","surfaceDestroyed");
        stopPreView();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.i("wanlijun","surfaceCreated");
        startPreView(holder);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Log.i("wanlijun","surfaceChanged");
        if(surfaceHolder.getSurface() == null)return;
       stopPreView();
       startPreView(surfaceHolder);
    }

}

//在自定义的SurfaceView里面初始化一些东西,才能在打开camera的时候就显示预览,这个顺序很重要,不然预览窗口很可能黑屏

public class CameraActivity extends AppCompatActivity{

    private MySurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;
    private Camera camera;
    private Button takeBtn;
    OrientationEventListener mOrientationEventListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        surfaceView = (MySurfaceView)findViewById(R.id.surfaceView);
        takeBtn = (Button)findViewById(R.id.takeBtn);
        takeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(CameraActivity.this);
                builder.setMessage("让我做你的眼睛,带你去看天上星");
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                builder.create().show();
            }
        });
        mOrientationEventListener = new OrientationEventListener(CameraActivity.this) {
            @Override
            public void onOrientationChanged(int orientation) {
                if(orientation == OrientationEventListener.ORIENTATION_UNKNOWN)return;
                orientation = (orientation+90)%360;
            }
        };
        if(mOrientationEventListener.canDetectOrientation()){
            mOrientationEventListener.enable();
        }else {
            mOrientationEventListener.disable();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("wanlijun","onResume");
        if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            if(ActivityCompat.checkSelfPermission(CameraActivity.this,Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(CameraActivity.this,new String[]{Manifest.permission.CAMERA},101);
            }else{
                init();
            }
        }else{
            Toast.makeText(CameraActivity.this,"此设备不支持相机",Toast.LENGTH_LONG).show();
        }
    }

    private void init(){
        try {
            if(camera == null){
                camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
            }
            camera.setFaceDetectionListener(new Camera.FaceDetectionListener() {
                @Override
                public void onFaceDetection(Camera.Face[] faces, Camera camera) {

                }
            });
           surfaceView.setCamera(camera);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("wanlijun","onDestroy");
        if(camera != null){
            camera.release();
        }
        if(mOrientationEventListener != null){
            mOrientationEventListener.disable();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == 101){
            if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                init();
            }else{
                Toast.makeText(CameraActivity.this,"请先开启相机权限",Toast.LENGTH_LONG).show();
            }
        }
    }
}
权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera"
    android:required="true"/>
<uses-feature android:name="android.hardware.camera.autofocus"
    android:required="true"/>

猜你喜欢

转载自blog.csdn.net/u010015933/article/details/80578616