我正在开发一款相机应用程序,基本上是作为消息应用程序的一部分来附加图像等。该应用程序需要适用于> = SDK 2.2并且:
我无法尽可能多地使用默认Android相机,因为:
应用程序的性质决定了图像不应该保存到磁盘上,而且一些OEM(三星)喜欢这样做而不给你一个选择。
我无法调用任何其他相机应用程序可以拦截的意图,因为该应用程序可以保存图像。
我目前的问题是处理Android相机显然不喜欢纵向的事实。具体来说,经过一些挖掘后,我正在监控显示屏,并在轮换时调用setDisplayOrientation(90)
。这可以工作,但Surfaceview维度也需要更改,这必须在支持的维度内完成,否则参数设置会使应用程序崩溃。
我正在使用我发现here(getBestPreviewSize()
方法)的另一个SO片段,但它有一个明显的问题,我无法相信我没有找到其他人。
takePicture
生命周期的一部分涉及调用PostView
图片回调。这将显示当前暂停的SurfaceView
图像的静止图像,该图像将通过byteArray返回到原始和/或jpeg回调。我的问题是,这个图像在一些看似随机的测试设备上仍然存在偏差!因此,行为是用户以完美的4:3宽高比看到动态相机图像,直到他们拍摄照片并且他们呈现的图像被压扁。请注意,字节数组本身是正确的,当我在消息传递端点构造Bitmap
时,它显示正常,但这仍然是一个问题。
此时我无法看到如何改变静止图像显示。任何人都可以帮我这个吗?
答案 0 :(得分:6)
xy
上翻转此数据。
我不是在相机使用的表面视图上显示图像,而是用透明的ImageView
覆盖它并在那里绘制我的位图。
你可以(希望)在javaocr project找到一些灵感,其中android deamon在纵向模式下工作,并在实时预览上绘制位图。 (请从git
结帐,因为它现在正在发布,我正在与git和maven斗争,请参阅演示目录)
答案 1 :(得分:3)
我怀疑你的问题处于几个不同的水平。
传感器安装
首先,相机传感器在每个设备上安装不同。 Google提供了锅炉版代码,用于获取该方向并设置正确的旋转值以对其进行更正here,最好是API 8。
AR更正
第二个问题显然是预览帧与屏幕的宽高比不同。您可以使用this帖子来解决此问题。 surfaceview维度与最佳预览大小无关,这些值不必匹配 - 事实上,你的AR混乱证明它们不匹配。
预览相框尺寸!=图片尺寸
最后,当您使用takePicture拍摄照片时,照片的大小完全独立于预览框的大小。使用以下命令查询和设置预览帧大小: setPreviewSize() / getSupportedPreviewSizes()
使用以下命令查询和设置图片大小(来自takePicture()): getSupportedPictureSizes() / setPictureSize()
您可能会幸运地使用某些设备,图片和预览框的默认设置将相同。在所有设备上都不是这种情况。
最后,如果您想显示拍摄的照片,如果它与SurfaceView的尺寸不同,您可能需要对其进行AR校正。或者,您可以将其绘制到ImageView并使用ScaleType.CENTER_INSIDE来保留纵横比。
答案 2 :(得分:0)
查看有关如何将QR扫描仪切换为纵向的帖子:http://code.google.com/p/zxing/issues/detail?id=178。我不知道它是否与您将图片交换成肖像有关,但也许它提供了一些指导。评论#11似乎是最有帮助的。 (我不支持从Sean Owen中删除QR应用代码)。