1:说明
Android开发实现Camera自定义的话,也并不是件难事,主要步骤如下:
- 打开相机,即实例化Camera对象,Camera camera = Camera.open();
- 设置Camera的相关参数,Camera.Parameters parameters = camera.getParameters();
- 打开预览,camera.setPreviewDisplay(surfaceholder); camera.startPreview();
- 获取图片,这里只是从预览中获取因此使用,camera.setPreviewCallback(new Camera.PreviewCallback(){……..});
- 停止预览,释放相机,camera.stopPreview();camera.release();
2:那么问题来了,仅仅这样就行了吗?
当然,我们还需要显示Camera预览的图像的地方。因此需要一个叫做SurfaceView的控件,和一个用来控制显示的SurfaceHolder的东西。步骤如下:
- 定义SurfaceView控件; SurfaceView mySurfaceView = (SurfaceView)findViewById(R.id.id_mySurfaceView);
- 实例化SurfaceHolder,这个是实现预览处理的地方,相机打开预览的时候要设置camera.setPreviewDisplay(surfaceholder); 表明在SurfaceHolder 上面实现预览。当然实例化是这样实现的:SurfaceHolder surfaceHolder = mySurfaceView .getHolder();
- 给SurfaceHolder设置回调,也就是类似于监听,只不过它主要是监听Camera的相关状态;surfaceHolder.addCallback(this);
- 实现SurfaceHolder.Callback接口,类似于定于监听就要实现相对应的监听接口。然后就会有三个方法要实现。
3:详细讲解SurfaceHolder.Callback接口对应的三个函数:
(1) surfaceCreated方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
(2)surfaceChanged方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
(3)surfaceDestroyed方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
4:在哪里获取图片呢?
这要是我们的主要任务,不获取图片貌似我们也没有必要打开相机哈。
可以定义一个按钮来获取图片,调用获取图片的方法不就好了嘛,那么就开始获取预览帧图片的获取的方法吧:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
这里就是图片旋转函数:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
5:到此好像图片的预览帧获取也就实现了。
但是还有几个问题:
(1)Camera的参数设置:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
(2)获取预览帧问题
camera.setPreviewCallback(new Camera.PreviewCallback(){……..});
可以在里面处理每一帧的数据,进行人脸检测等算法的调用。