![c98a04c9b875bc54aa72ac37bb93ef2e.png](https://i-blog.csdnimg.cn/blog_migrate/8a4e725350d4559d921d88a6a346a00e.png)
Android 相机打开预览后,可能存在旋转90/180/270度的问题,也会影我们计算预览尺寸,应该怎么处理呢?
由于大部分手机都是旋转了90度,导致很多开发者直接把预览画面转90度回去,出现兼容问题,这是不对的。
预览角度旋转的原因:
(1) 摄像头传感器在安装时就和屏幕竖直方向存在夹角(orientation),大部分手机为90度;
(2) 手机会横竖屏切换,导致手机屏幕的上方向和手机物理的上方向也有一个角度(rotation)。
下面我们看如何恢复画面的预览:
1. 获取相机传感器的安装角度
安装角度是指手机自然状态下的上方向与摄像头的上方向的夹角,方向是从摄像头的上方向逆时针旋转到手机的上方向。
![2f548c3e4913b681e48ec829606fe880.png](https://i-blog.csdnimg.cn/blog_migrate/f30c252ff43de0ac6b1d7e6f46cf78eb.jpeg)
Camera1:
fun getCameraOrientation(cameraID: Int): Int {
val info = new Camera.CameraInfo()
Camera.getCameraInfo(cameraID, info)
return info.orientation
}
Camera2:
fun getCameraOrientation(context: Context, cameraID: Int): Int {
val manager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
// 获取该相机的特征
val properties = manager.getCameraCharacteristics(cameraID)
// 获取相机配置
val config = properties.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
// 获取旋转角度
return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)
}
2. 获取手机屏幕的角度
屏幕的角度是指手机自然状态下的上方向与当前画面上方向的夹角。方向是从画面上方向逆时针旋转到手机上方向。
![c25ed2f6caedb6aebe7cc825cd335dd3.png](https://i-blog.csdnimg.cn/blog_migrate/c05dca64c55364dc97dca8f2334d945d.jpeg)
fun displayRotation(context: Context): Int {
return when(context.windowManager.defaultDisplay.rotation) {
Surface.ROTATION_0 -> 0
Surface.ROTATION_90 -> 90
Surface.ROTATION_180 -> 180
Surface.ROTATION_270 -> 270
else -> 0
}
}
3. 计算恢复角度
通过两个角度的定义,我们很容易知道怎么旋转可以把画面恢复:
val angle = (orientation - rotation + 360) % 360
4. 使用恢复角度
- 用于矫正 Camera1 的预览角度:
camera.setDisplayOrientation(angle)
- 用于矫正 Camera1 的照片保存角度: Camera1 通过设置 Parameters 矫正照片保存角度:
val camera: Camera = ...
val params = camera.getParameters()
params.setRotation(angle)
camera.setParameters(params)
- 用于矫正 Camera2 的照片保存角度: Camera2 在创建 CaptureRequest 时设置照片保存角度:
val builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)
builder.set(CaptureRequest.JPEG_ORIENTATION, angle)
Camera2 在预览时会自动矫正预览角度。
在挑选预览画面尺寸时,也是需要用到这个角度的。