安卓中可以操作相机的类有hardware.Camera和Camera2,后者只适用于6.0+的部分机型,所以这里只探究API1的Camera。
项目里发现使用了SurfaceTexture,SurfaceTexture不同于SurfaceView和GLSurfaceView的地方在于它接受输入数据但是不在屏幕上绘制出来,因此可以作为数据源和view之间的一层,处理传来的数据然后交给view绘制。项目里这部分涉及到JNI,太复杂了,这这里就不探究了。只看Camera的基本使用。
这里配合SurfaceView使用。
1.预览:
初始化(有权限的前提下):Camera cam = Camera.open();
还有一个带参数的重载,传入的是camId,这个id就代表相机编号。现在的手机一般都不是一个摄像头,在Camera.CameraInfo里定义了两个常量,从字面意义上就能看出表示前置和后置两个摄像头id。
然后在surfaceView.getHolder.setCallback中的surfaceCreated里拿到SurfaceHolder交给cam执行预览,相当于一个绑定,数据从相机流入surfaceview:
默认发现相机角度偏了90度,所以这里转回去。
2.翻转镜头:
先释放原相机资源然后获得另一个相机开始预览。上面提到两个常量,前置和后置相机Id分别是1和0,所以代码是这样的:
camera.stopPreview();
camera.release();
camera = Camera.open(1-currentId);
camera.setPreviewDisplay(holder);
camera.setDisplayOrientation(90);
camera.startPreview();
currentId是每次获取相机时记录的当前Id。