Camera API:跨设备问题

时间:2012-10-04 22:19:36

标签: java android camera

我正在开发一款相机应用程序,基本上是作为消息应用程序的一部分来附加图像等。该应用程序需要适用于> = SDK 2.2并且:

无法尽可能多地使用默认Android相机,因为:

  1. 应用程序的性质决定了图像不应该保存到磁盘上,而且一些OEM(三星)喜欢这样做而不给你一个选择。

  2. 我无法调用任何其他相机应用程序可以拦截的意图,因为该应用程序可以保存图像。

  3. 我目前的问题是处理Android相机显然不喜欢纵向的事实。具体来说,经过一些挖掘后,我正在监控显示屏,并在轮换时调用setDisplayOrientation(90)。这可以工作,但Surfaceview维度也需要更改,这必须在支持的维度内完成,否则参数设置会使应用程序崩溃。

    我正在使用我发现heregetBestPreviewSize()方法)的另一个SO片段,但它有一个明显的问题,我无法相信我没有找到其他人。

    takePicture生命周期的一部分涉及调用PostView图片回调。这将显示当前暂停的SurfaceView图像的静止图像,该图像将通过byteArray返回到原始和/或jpeg回调。我的问题是,这个图像在一些看似随机的测试设备上仍然存在偏差!因此,行为是用户以完美的4:3宽高比看到动态相机图像,直到他们拍摄照片并且他们呈现的图像被压扁。请注意,字节数组本身是正确的,当我在消息传递端点构造Bitmap时,它显示正常,但这仍然是一个问题。

    此时我无法看到如何改变静止图像显示。任何人都可以帮我这个吗?

3 个答案:

答案 0 :(得分:6)

Android相机系统很乱。并且beind焊接到主板,相机芯片不会像portait应用程序 - 所有回调以相机方向溢出数据(你收到的缓冲区实际上是与本机相机应用程序共享的内存块) - 如果你想在你的应用程序时显示它在portait模式下,您必须在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应用代码)。