如何在Android中设置相机方向?

时间:2016-07-22 03:42:28

标签: android camera android-camera screen-orientation exif

我已经查看了其他人提出这个问题的问题,但我不确定解决这个问题的最佳方法是什么。在通过Android的指南实现相机后,我所拥有的相机预览被锁定在风景中。我想知道如何调整相机方向以反映手机的方向。

我试过这个

camera.setDisplayOrientation(90);

这将相机锁定为纵向模式,因此我需要另一种解决方案(最好是适用于大多数设备的解决方案)。

另外,我怎样才能使保存的图像以与预览相同的方式显示?现在,如果我使用上面的代码行使预览变为纵向,则保存的图像仍然会旋转为景观。

3 个答案:

答案 0 :(得分:4)

 Camera.Parameters params= mCamera.getParameters();
 params.set("rotation", 90); 
 mCamera.setParameters(params);

答案 1 :(得分:1)

在确定要选择的预览尺寸时,您需要考虑方向。例如,来自ApiDemos的getOptimalPreviewSize()的{​​{1}}无法定位,只是因为他们的应用版本的方向已锁定为横向。如果您希望方向浮动,则需要反转目标纵横比以匹配。那么,CameraPreview有这个

getOptimalPreviewSize()

double targetRatio=(double)width / height;

其中if (displayOrientation == 90 || displayOrientation == 270) { targetRatio=(double)height / width; } 是一个从0到360的值,我从大约100行的一些严重丑陋的代码中确定,这就是为什么我将所有这些包装在一个可重复使用的组件中,这是我'我将很快发布。

其次,在控制您正在使用的displayOrientation / SurfaceView的宽高比时,您需要考虑该显示方向。来自TextureView的{​​{1}}活动有自己的预览CameraPreview来处理宽高比,您需要在纵向中反转宽高比:

ApiDemos

其中ViewGroup是相同的值(90和270分别是纵向和反向肖像,并注意我没有尝试过反向肖像或反向横向工作,所以可能有需要更多调整)。

第三 - 您必须在if (displayOrientation == 90 || displayOrientation == 270) { previewWidth=mPreviewSize.height; previewHeight=mPreviewSize.width; } else { previewWidth=mPreviewSize.width; previewHeight=mPreviewSize.height; } 上致电displayOrientation之前开始预览。否则,它就好像图片的宽高比被应用于预览帧一样,搞砸了。

setPictureSize()

答案 2 :(得分:0)

我使用谷歌的相机应用修复此问题。它通过使用传感器获取手机的方向,然后适当地设置EXIF标签。从相机发出的JPEG不会自动定向。

此外,相机预览仅在横向模式下正常工作。如果您需要将您的活动布局纵向定向,则必须使用方向传感器中的值手动完成。

我建议您查看照片的exif数据并特别注意

ExifInterface exif = new ExifInterface(SourceFileName);   //API Level 5
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION);

发表评论并告诉我这是否对您有所帮助。