最近用Android camera2做自定义相机,基本的关于打开相机到预览的过程就不多叙述了
大家参看https://github.com/gengqifu/361Camera这个文章就可以知道
今天详细讲讲我开过程中遇到的旋转角度的问题
直接上代码
//初始化传感器定位
orientationEventListener = object : OrientationEventListener(mActivity) {
override fun onOrientationChanged(orientation: Int) {
Log.e("orientation", "orientation=$orientation")
sensorOrientation = when (orientation) {
-1 -> ORIENTATION_VERTICAL
in 70..134 -> 90
in 135..224 -> 180
in 225..280 -> 270
else -> 0 //这里应该是281-69的范围
}
}
}
orientationEventListener.enable()
这就是相机中 传感器定位的回调代码,是kotlin的代码。
代码以一个竖直平面,360度内旋转
正常应该是以45-134 135-224 225-314 315-45 这样4个区间
每90度一个区间平均分,但是实际开发中 我们判断为横屏拍照时,手机几乎得是旋转90度 才代表用户是横屏
所以我加大了orientation为0的这样一个角度区间 减小了orientation为90和270的这样一个区间(判定为横屏拍照的区间)。
因此可以根据需求,调整你的区间 达到需求的目的。
上面是我们手机在竖直拍照时,水平拍照时怎么处理喃?
大家看到我的log日志中有个orientation为-1,这说明手机这时候已经水平放置了
这个时候你在水平面内 左右旋转这个orientation都不会改变 都是-1
因此我们在-1的时候,其实就默认是竖屏拍照就可以了,这是一个很容易忽略的点
val captureBuilder = cameraDevice?.createCaptureRequest(
CameraDevice.TEMPLATE_STILL_CAPTURE
)?.apply {
if (::previewImageReaderSurface.isInitialized) {
addTarget(previewImageReaderSurface)
}
set(
CaptureRequest.JPEG_ORIENTATION,
CameraUtil.getJpegOrientation(
CameraConfig.getCurrentCameraCameraCharacteristics(),
sensorOrientation
)
)
if (lightIsOpened()) {
set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON)
set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH)
} else {
set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
}
set(
CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH
)
set(
CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE
)
//锁定焦点
set(
CaptureRequest.CONTROL_AF_TRIGGER,
CameraMetadata.CONTROL_AF_TRIGGER_START
)
//手机水平拍摄的时候 设置成VERTICAL
if (sensorOrientation == ORIENTATION_VERTICAL) {
set(CaptureRequest.JPEG_ORIENTATION, 90)
}
}
这就是在拍照前,对相机的一些列设置 最后一个就是判断手机是水平时 将输出图片的orientation设置为90就可以了
我测试了手机自带的相机,水平拍摄时也是同样的处理方式