Android-GLSurfaceView预览摄像头
权限申请
清单文件中添加权限
1 | <uses-permission android:name="android.permission.CAMERA"/> |
申请摄像头权限
1 | ActivityCompat.requestPermissions(this, new String[] { |
自定义View
在项目中,为追求代码简洁,在自定义View中实现GLSurfaceView显示摄像头画面
创建一个SuperSurfaceView类,使该类继承GLSurfaceView,并重写两个构造方法
1 | public class SuperSurfaceView extends GLSurfaceView { |
添加一个设置摄像头类型的方法
1 | private int cameraType = 0; // 摄像头类型,一般情况下,0为后置摄像头,1为前置摄像头 |
添加一个开启摄像头预览的方法,后面写完GLSurfaceView渲染器之后再补其中的代码
1 | public void launch() { |
渲染器
创建SuperRenderer类,在构造器中接收SuperSurfaceView实例和摄像头的类型,并为摄像头的类型创建一个set方法
实现GLSurfaceView.Renderer和SurfaceTexture.OnFrameAvailableListener接口,重写如下的四个方法
1 | public class SuperRenderer implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener { |
初始化工作
着色器代码
1 | // 顶点着色器 |
加载着色器
1 | private int loadShader(int shaderType, String shaderSource) { |
加载着色器,创建OpenGL ES程序程序
1 | private int programId; |
float数组转换为FloatBuffer
1 | private FloatBuffer floatArr2FloatBuffer(float[] buffer) { |
添加程序到ES环境中
1 | private int positionHandle; |
在onSurfaceCreated()
中调用
1 |
|
窗口大小改变时
1 | private final float[] orthoMatrix = new float[16]; // 接收正交投影的变换矩阵 |
绘制画面
1 | private SurfaceTexture surfaceTexture; // 用于建立摄像头和GLSurfaceView之间的连接 |
操作摄像头
打开摄像头,关闭摄像头
1 | private Camera camera; |
调用方式
在之前没写完的launch()
方法中添加
1 | private SuperRenderer superRenderer; |
并且在SuperSurfaceView
中添加close()
方法供关闭
1 | public void close() throws Exception { |
在Activity
中调用时
1 | private void initCamera() { |
Activity
销毁时
1 |
|
点击按钮切换前后摄像头时
1 | Button switch_camera = findViewById(R.id.switch_camera); |
获取当前帧
获取当前帧的bitmap,通过接口的方式传输bitmap数据,在SuperSurfaceView类中添加如下
1 | /** |
在Activity中的调用
1 | superFaceView.getBitmap(new SuperSurfaceView.BitmapCallback() { |
页面布局
在布局文件中添加
1 |
|
预览