相机API:跨设备问题

14

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

不能使用默认的Android相机,因为:

  1. 应用程序的性质决定了图像不应该被保存到磁盘上,但一些OEM(如三星)会在没有给你选择的情况下这样做。

  2. 我不能调用其他任何相机应用程序可以拦截的intent,因为那个应用程序可能会保存图像。

我的当前问题是处理Android相机显然不喜欢竖屏方向的事实。具体而言,在某些挖掘后,我正在监视显示器,并在旋转时调用 setDisplayOrientation(90)。这个方法有效,但surfaceview的维度也需要被更改,并且必须在支持的维度范围内完成,否则参数设置将导致应用程序崩溃。

我正在使用另一个SO片段(getBestPreviewSize() 方法)来解决这个问题,但它有一个明显的问题,我不敢相信我没找到其他人遇到这个问题。

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

我无法看到如何在此时更改静态图像的显示。有人可以帮助我解决这个问题吗?


你能否保留之前的预览图片回调函数,并在实际拍摄照片时显示它?最后,你能否从所拍摄的图片数据中创建位图并显示该位图,而不是使用预览图像数据?我想这取决于最终图像数据是否混乱,或者表面视图是否以某种方式改变了形状。 - Douglas Jones
3个回答

6

Android相机系统很混乱。而且由于焊接在主板上,相机芯片不会喜欢肖像应用程序 - 所有回调都会在相机方向中泄漏数据(您收到的缓冲区实际上是与本地相机应用程序共享的内存块) - 如果您想在应用程序处于纵向模式时显示它,则必须翻转此数据 xy

我将使用透明的 ImageView 覆盖相机使用的surface view,并在那里绘制我的位图。

您可以(希望如此)在我们的javaocr项目中找到一些灵感,其中android deamon以肖像模式工作,并在实时预览上绘制位图。(请从 git 检出,因为它现在正在发布并且我正在与git和maven搏斗,请参见演示目录)


我最后在上个星期五“解决”了这个问题,方法就是构建一个位图并显示它。我原本试图避免这样做,因为我的应用程序已经相当占用堆内存,并且我们都知道在 Android 3.0 之前存在本地 Bitmap 分配问题。但我跑题了...感谢您抽出时间发帖。 - Andrew G
确保在 BitmapFactory 的 options 中设置 inSampleSize。这会在处理内存问题时非常有帮助。 - samuelesque

3
我猜想你的问题存在多个层面。
传感器安装
首先,每个设备上的相机传感器安装位置都不同。Google有模板代码来获取方向并设置正确的旋转值来进行校正在这里,它可以很好地适用于API 8及以下版本。
AR校正
第二个问题显然是预览帧与屏幕不同的宽高比。您可以使用文章解决。SurfaceView的尺寸与最佳预览尺寸没有关系,这些值不必匹配-实际上,您的AR出现问题就证明了它们不匹配。
预览帧大小!=图片大小

最后,当您使用takePicture拍摄照片时,照片的大小完全独立于预览帧的大小。使用以下内容查询和设置预览帧大小:setPreviewSize() / getSupportedPreviewSizes()

使用以下内容查询和设置图片大小(来自takePicture()):getSupportedPictureSizes() / setPictureSize()

有些设备可能会幸运地获得相同的默认图片和预览框架大小。但并非所有设备都是如此。

最后,如果您想显示拍摄的照片,并且其大小与SurfaceView不同,则可能需要对其进行AR校正。或者,您可以将其绘制到ImageView上,并使用ScaleType.CENTER_INSIDE以保持纵横比。

0

看看这篇关于如何将QR扫描器切换为竖屏的帖子:http://code.google.com/p/zxing/issues/detail?id=178。我不知道它是否与您将图片交换为竖屏有关,但也许它提供了一些指导。评论#11似乎是最有帮助的。(我不赞成从Sean Owen那里抄袭QR应用程序代码)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接