Android 处理相机和用户旋转

Android 处理相机和用户旋转,android,camera,android-camera,android-orientation,Android,Camera,Android Camera,Android Orientation,我已经阅读了很多答案,但是代码太多了,我不知道该选择哪个方向。我希望有人能给我指出正确的方向 我有一个自定义的相机应用程序,可以从前面或后面的相机显示预览(SurfaceHolder)。我有一个按钮,用户可以将预览图像旋转90/180/270度。该值将被保存并应用于相机和预览图像 然而,当用户拍照时,图像的方向是不同的。我的问题是:我如何解释用户和设备的方向,以便输出图像与预览图像一样旋转?一个可能的方向(如果您在Android Studio上)是从中提取代码,逐步执行并根据需要修改它。它当然不

我已经阅读了很多答案,但是代码太多了,我不知道该选择哪个方向。我希望有人能给我指出正确的方向

我有一个自定义的相机应用程序,可以从前面或后面的相机显示预览(
SurfaceHolder
)。我有一个按钮,用户可以将预览图像旋转90/180/270度。该值将被保存并应用于相机和预览图像

然而,当用户拍照时,图像的方向是不同的。我的问题是:我如何解释用户和设备的方向,以便输出图像与预览图像一样旋转?

一个可能的方向(如果您在Android Studio上)是从中提取代码,逐步执行并根据需要修改它。它当然不会“不管你的应用程序做什么”,但它可以让你脱离现实(或者可能让你更加困惑)。注意,它只处理后凸轮。不管怎么说,先告诉我一点信息

1/当您的活动开始时(onCreate),记录其旋转并锁定,以便在您重新定位手机时视图不会跳转。根据您的初始状态,您的方向可能是港口或陆地。例如,你也可以“强迫”它着陆,但当你的活动开始时,它看起来会急促

2/onSurfaceChanged为您提供曲面大小。它可以是港口(WH)。将曲面W、H发送到摄影机管理器以选择理想的预览尺寸。由于“getSupportedPreviewSizes”主要(我想说总是,但不是100%确定)是LAND(W>H)类型,因此需要相应地交换曲面W和H

3/不要忘记将“设置显示方向”设置为初始方向,这样预览就不会横向

4/几乎可以肯定的是,曲面W:H与提供的预览尺寸W:H不完全相同,导致挤压/拉伸预览(只需使用cam预览查看任何圆形对象)。因此,现在必须再次调整曲面大小,请参见“surfaceChanged”末尾的“setLayoutParams”。值得注意的是,你可以调整你的表面以适应(信箱),在侧面产生两条背景色的条纹,或者用一些溢出的屏幕填充(平移和扫描)你的整个表面区域(谁在乎)

这有助于您获得正确的预览。我还应该提到预览方向的另一个怪癖。有些平板电脑(Nexus1Gen,…)具有自然定向焊盘,但有些(如三星8.3.0)具有端口。此问题在初始化期间进行了调整,并用“isLandTab”布尔值表示

5/现在,当您最终从Camera.getPicture获取图片时,您只需使用与旋转预览相同的量将其旋转回来。相当昂贵的操作(内存方面)。您必须将其解压缩为位图,旋转并。。。。做你想做的事。再次压缩,显示

现在,当你终于摆脱了这种荒谬的咆哮,你可能会问自己。将活动强行进入陆地,锁定它,不是更好吗。在这种情况下,你

  • 不必交换曲面W,H
  • 不必设置显示方向
  • 在获得图片后,不必旋转图片
  • 您仍然需要调整曲面视图大小以适应提供/选择预览的比例

    祝你玩得开心,好运