做了挺久Camera相关的事情,有一些使用心得,以及避免踩坑的套路。有兴趣可以看下代码是怎么拼凑出目标功能的,逻辑脏但是功能稳健。不用了解原理,能提供想要的功能用就是了,别学了....
添加依赖
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
implementation 'com.github.readsense-cn:RSUtil:1.3.0'
权限
<uses-permission android:name="android.permission.CAMERA" />
Android 6.0以上需要动态申请权限
使用一键应用
在指定页面位置添加控件
<cn.readsense.rscamera.camera.CameraView
android:id="@+id/cameraview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
class MainActivity : BaseCoreActivity() {
override fun getLayoutId(): Int {
requestPermissions(Manifest.permission.CAMERA)//声明权限
return R.layout.activity_main;//声明布局文件
}
override fun initView() {
cameraview.showToast("长按可弹出配置页");
addLifecycleObserver(cameraview)//注册camera生命周期
}
}
支持功能
1. 切换摄像头
//改变camera id后释放重新show
cameraView.getCameraParams().facing = Camera.CameraInfo.CAMERA_FACING_BACK;
2. 任意角度旋转摄像头预览方向
//show之前,设定display角度,支持(0, 90, 180, 270)
//输入非90倍数将根据activity方向以及设备自动适应,可能不太灵
cameraView.getCameraParams().oritationDisplay = 0;
3. 修改预览分辨率
//根据摄像头支持的分辨率,release后重新show
cameraView.getCameraParams().previewSize.previewWidth = 640;
cameraView.getCameraParams().previewSize.previewHeight = 480;
4. 摄像头预览左右镜像
cameraView.getCameraParams().filp = true;
5. 预览不拉伸任意比例展示
设定cameraview指定宽高后,预览图像,若图像拉伸启用参数
//是否横向拉伸参数,非横即竖
cameraView.getCameraParams().scaleWidth = true;
6. 回调数据
注册回调后再启动摄像头
cameraView.addPreviewFrameCallback(new CameraView.PreviewFrameCallback() {
@Override
public Object analyseData(byte[] bytes) {
//接收yuv数据流,处理后的结果return,该方法执行在子线程
return null;
}
@Override
public void analyseDataEnd(Object o) {
//接收analyseData方法返回结果,该方法执行在主线程
}
});
7. 提供预览界面上绘制必要信息的DrawView
//showCameraView之前配置DrawView
cameraView.setDrawView();
//获取drawView,类型为SurfaceView,可以直接在这个Surface绘制必要的信息
SurfaceView drawView = cameraView.getDrawView();
Canvas canvas = drawView.getHolder().lockCanvas();
if (canvas != null) {
canvas.drawColor(0, PorterDuff.Mode.CLEAR);
//...插入绘制代码
drawView.getHolder().unlockCanvasAndPost(canvas);
}