SurfaceView 自定义相机开发

Surfaceview 自定义相机,支持分辨率修改,开关闪光灯,可以切换前后摄像头,拍摄完成存为图片,先上效果图:

 

MainActicity.java

private Camera camera;
    private boolean preview = false;
    private ImageView change, takephoto,flash;
    private int cameraPosition = 0;
    private SurfaceHolder holder;
    private ImageView imageView;
    private LinearLayout ll_view;
    int picWidth = 1920;
    int picHeight = 1080;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 拍照过程屏幕一直处于高亮

        setContentView(R.layout.activity_main);
        initView();
        ll_view.getBackground().setAlpha(80);
        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        holder = surfaceView.getHolder();
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
     
        //holder.setFixedSize(1080, 1920);
        holder.addCallback(new SurfaceViewCallback());

        takephoto.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                camera.autoFocus(new AutoFocusCallback() {// 自动对焦
                    @Override
                    public void onAutoFocus(boolean success, Camera camera) {
                        if (success) {
                            camera.takePicture(null, null, jpeg);// 将拍摄到的照片给自定义的对象
                        }
                    }
                });
            }
        });

        change.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                int cameraCount = 0;
                CameraInfo cameraInfo = new CameraInfo();
                cameraCount = Camera.getNumberOfCameras();// 得到摄像头的个数

                for (int i = 0; i < cameraCount; i++) {
                    Camera.getCameraInfo(i, cameraInfo);// 得到每一个摄像头的信息
                    if (cameraPosition == 0) {
                        // 现在是后置,变更为前置
                        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {// 代表摄像头的方位,CAMERA_FACING_FRONT前置                                                    // CAMERA_FACING_BACK后置
                            camera.stopPreview();// 停掉原来摄像头的预览
                            camera.release();// 释放资源
                            camera = null;// 取消原来摄像头
                            camera = Camera.open(i);// 打开当前选中的摄像头
                            try {
                                camera.setPreviewDisplay(holder);// 通过surfaceview显示取景画面
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            getWH(camera);
                            setCameraDisplayOrientation(MainActicity.this,cameraPosition, camera,270);
                            camera.startPreview();// 开始预览
                            cameraPosition = 1;
                            break;
                        }
                    } else {
                        // 现在是前置, 变更为后置
                        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {// 代表摄像头的方位,CAMERA_FACING_FRONT前置                                                    // CAMERA_FACING_BACK后置
                            camera.stopPreview();// 停掉原来摄像头的预览
                            camera.release();// 释放资源
                            camera = null;// 取消原来摄像头
                            camera = Camera.open(i);// 打开当前选中的摄像头
                            try {
                                camera.setPreviewDisplay(holder);// 通过surfaceview显示取景画面
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            getWH(camera);
                            setCameraDisplayOrientation(MainActicity.this,cameraPosition, camera,0);
                            camera.startPreview();// 开始预览
                            cameraPosition = 0;
                            break;
                        }
                    }

                }
            }
        });
        
        flash.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                setFlashMode();
            }
        });

    }
 

 

需要源码的朋友可以点下面链接下载:

https://download.csdn.net/download/jo_nes27/10582623

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值