手机摄像头(Camera)的图像数据来源于摄像头硬件的图像传感器,这个图像传感器被固定到手机上后会有一个默认的取景方向,这个取景方向恰好是当手机左侧横放时的方向,其坐标原点于手机横放时的左上角。手机的正常方向和图像传感器默认取景方向示意图如下: 

PDA 摄像头 Android 画面方向 摄像头手机调整方向_android预览方向转

Camera预览方向处理:

从上面的示意图可知,图像传感器的取景方向与手机正常方向成90读夹角,按理来说,当我们以正常的手机方向来打开相机时,看到的预览图像应该是横向的。但是,当我们打开系统相机后,看到的预览图像却是正常的,即预览图像与手机方向一致。这是因为系统自带的相机在Android系统底层根据当前手机屏幕的方向对图像传感器采集到的数据进行了旋转,所以无论我们怎么旋转手机屏幕,看到的相机预览图片始终是“正常”的。而对于自定义的相机,,如果没有对图像传感器的图片进行旋转处理,那么看到的预览图片就是横向的:

PDA 摄像头 Android 画面方向 摄像头手机调整方向_android预览方向转

为了解决自定义相机预览方向不正常情况,Android系统提供了一个API来手动设置Camera的预览方向,即Camera.setDisplayOrientation(int

rotateDegree),默认情况下该方法的值为0,与图像传感器取景方向一致。旋转方法:

首先,通过Display的getOrientation()获得当前手机的方向,如Surface.ROTATION_0表示手机竖屏时正常方向、Surface.ROTATION_90表示手机方向向右手边横向放置等(沿顺时针判断)。其中,Display

display =

getWindowManager().getDefaultDisplay()获得。 其次,对于后置摄像头来说,它的预览成像为CameraInfo.orientatio-

phoneDegree,但由于这个值可能为负,角度值不能为负故需要加上360求正;对于前置摄像头(front

camera)来说,它的预览图像在旋转之前是水平翻转的,也就是前置摄像头的预览成像是沿图像的中央垂直线翻转过来,就像用户照镜子一样的效果。因此,在得到前置摄像头的旋转角度后(rotation

= CameraInfo.orientatio + degrees),还需要对其进行水平翻转(rotation =

360-rotation),即取rotation的负数即可,但是由于旋转的角度不能是负数,因此再加上360求正。其中,CameraInfo.orientatio是图像感应器相对于手机竖直正常方向的角度值、手机方向为相对于竖直正常方向沿顺时针转动的方向值。另外,当我们得到前后置摄像头旋转的方向后还需要对360求余,以防止旋转的角度超过一周360度的情况。