最近项目上需要在相机上做些开发,之前对这块不是很了解,就学习下,这里使用的Camera2进行,开发测试调试的手机是vivo Y9s(Andrioid9.0)
下面是主要流程步骤
- 检测是否有相机设备
- 检测相关相机权限
- 开启线程打开相机(>=21和<21)
- 预览过程
- 简单绘制
其中预览过程最为复杂需要下功夫去了解下的。
// 检测手机是否有摄像头
presenceCamera = checkCameraHardware(Camera.this);
mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
if (presenceCamera) {
// 在打开相机之前开启线程
startBackgroundThread();
// 在有相机设备得情况下,去检查权限
getPermissions();
} else {
showToast("该设备没有相机设备或相机设备已损坏");
}
// 打开相机
public void openCamera() {
try {
// 强制性的确认相机权限
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return;
}
// 打开相机后置摄像头
// 注意这里的Handle使用的是Android.os的包
// 0是后置;1是前置;
mCameraManager.openCamera(String.valueOf(cameraId), mStateCallback, mBackgroundHandler);
} catch (Exception e) {
e.printStackTrace();
}
}
// 开启相机设备的回调
private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
mCameraDevice = camera;
// 当相机成功打开时回调该方法,接下来可以执行创建预览的操作
// 获取相机设备参数
getCameraParam();
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
// 当相机断开连接时回调该方法,应该在此执行释放相机的操作
camera.close();
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
// 当相机打开失败时,应该在此执行释放相机的操作
// error = 2;可能是摄像头被占用了,或者在此之前开启过
camera.close();
}
};
后续还有操作我全部都放在了压缩包里面需要的可自行下载学习;Demo
Demo效果