二维码扫描之获取相机预览(一)

近期需要在手机上实现一个二维码扫描的功能,决定还是自己一步一步来,顺便做一个教程,现在我了解到的二维码扫描就是得到相机返回的数据,然后用算法得到二维码信息。
因为博主的测试机是android4.3的老人机,所以此系列的博客都是用的android.hardware.Camera类,这个类已经被谷歌抛弃,推荐使用新的类Camera2(android5.0)。

第一步,首先是将相机得到的数据显示到手机预览上。
这一步基本原理很简单。
首先创建一个Camer对象:

camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);

创建camera对象不是new一个那么简单,因为一般手机有两个摄像头,所以要确定打开哪一个摄像头,所以需要传入参数Camera.CameraInfo.CAMERA_FACING_BACK(后置摄像头)或者Camera.CameraInfo.CAMERA_FACING_FRONT(前置摄像头)。

接着,在布局中放置一个SurfaceView,并在activity中得到它的对象。

接下来就是比较绕了。

  1. 初始化相机。
    private void initCamera() {
        try {
            camera.setPreviewDisplay(surfaceView.getHolder());
        } catch (IOException e) {
            e.printStackTrace();
        }
        camera.startPreview();
    }

这是最基础的,这里设置了显示相机内容的地方(surface.getHolder),并且后面的startPreview()也是必不可少。

但是,当运行的时候还是一团黑,这是为什么呢?这里只是提取相机一次返回的preview,当相机返回preview之后它就不动了,要想持续不断的得到相机返回的preview,就需要设置surfaceView。

        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                initCamera();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                initCamera();
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
        });

这时候运行程序就可以得到相机返回的图像了。
但是问题又来了,为什么得到的相机图像是拉伸反转的呢?
原因是现在的手机摄像头都是横屏的,而显示屏是竖屏的,竖屏手机显示横屏摄像头内容的时候,会又挤压的效果。
解决方法是,设置相机的参数。

        camera.setDisplayOrientation(90);

将相机的旋转90就得到正常值。

相机的优化:
自动聚焦:camera.cancelAutoFocus();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值