用到的属性
//摄像头id列表
private lateinit var idList:Array<String>
//当前摄像头id
private lateinit var cameraId:String
//当前摄像头属性类
private lateinit var cameraCharacteristics:CameraCharacteristics
//预览Surface
private lateinit var surface:Surface
//当前摄像头
private lateinit var cameraDevice: CameraDevice
//拍照输出Surface
private lateinit var imageReader:ImageReader
//预览CaptureRequest.Builder
private lateinit var captureRequestBuilder: CaptureRequest.Builder
//拍照CaptureRequest.Builder
private lateinit var photographCaptureRequest: CaptureRequest.Builder
//显示拍照图片的协程
private var mainJob:Job? = null
//Session
private lateinit var cameraCaptureSession: CameraCaptureSession
//相机分辨率
private lateinit var size:Size
初始化
override fun init() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//初始化
CameraUtil.init(application)
//获取摄像头id列表
idList = CameraUtil.getCameraIdList()
cameraId = idList[CameraUtil.index]
//开启surfaceTextureListener监听,获取Surface
textureView.surfaceTextureListener = surfaceTextureListener
}
//拍照
button.setOnClickListener {
photograph()
}
//切换相机
switchCamera.setOnClickListener {
switchCamera()
}
}
/**
* 拍照
*/
private fun photograph(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// 设置获取的照片方向
if (CameraUtil.index == 0){
CameraUtil.photoDirection(photographCaptureRequest,90)
}else {
CameraUtil.photoDirection(photographCaptureRequest,90*3)
}
//停止连续取景
cameraCaptureSession.stopRepeating()
//捕获单张图片
cameraCaptureSession.capture(photographCaptureRequest.build(), captureCallback, CameraUtil.getBackgroundHandler())
}
}
/**
* 切换相机
*/
private fun switchCamera(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cameraDevice.close()
imageReader.close()
//切换相机
cameraId = CameraUtil.switchCamera(this,mStateCallback)
}
}
获取Surface并开启摄像头
/**
* 获取Surface的回调
*/
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
private val surfaceTextureListener = object :TextureView.SurfaceTextureListener{
//SurfaceTexture大小发生变化时调用
override fun onSurfaceTextureSizeChanged(surfaceTexture: SurfaceTexture, width: Int, height: Int) {
//获取相机属性类
cameraCharacteristics = CameraUtil.getCameraCharacteristics(cameraId)
//设置预设的预览尺寸
size = CameraUtil.setDefaultBufferSize(surfaceTexture,cameraCharacteristics)
surface = Surface(surfaceTexture)
}
override fun onSurfaceTextureUpdated(surface: SurfaceTexture?) {
}
override fun onSurfaceTextureDestroyed(surfaceTexture: SurfaceTexture?): Boolean {
return true
}
override fun onSurfaceTextureAvailable(surfaceTexture: SurfaceTexture, width: Int, height: Int) {
//获取相机属性类
cameraCharacteristics = CameraUtil.getCameraCharacteristics(cameraId)
//设置预设的预览尺寸
size = CameraUtil.setDefaultBufferSize(surfaceTexture,cameraCharacteristics)
surface = Surface(surfaceTexture)
//开启摄像头
CameraUtil.openCamera(this@VideoActivity,cameraId,mStateCallback)
}
}
/**
* 自动修改textureView宽高以适应不同预览比例
*