Java 摄像头API:跨设备问题

Java 摄像头API:跨设备问题,java,android,camera,Java,Android,Camera,我正在开发一个摄像头应用程序,它基本上是消息应用程序的一部分,用于附加图像等。该应用程序需要适用于>=SDK 2.2和: 我无法使用默认的Android摄像头,因为: 应用程序的本质决定了图像永远不应该保存到磁盘上,一些原始设备制造商(三星)喜欢这样做而不给你选择 我不能称之为任何其他摄像头应用程序都可以拦截的意图,因为这样该应用程序就可以保存图像 我目前的问题是,Android摄像头显然不喜欢纵向拍摄。具体来说,在一些挖掘之后,我正在监视显示器,并在旋转时调用setDisplayOrienta

我正在开发一个摄像头应用程序,它基本上是消息应用程序的一部分,用于附加图像等。该应用程序需要适用于>=SDK 2.2和:

无法使用默认的Android摄像头,因为:

  • 应用程序的本质决定了图像永远不应该保存到磁盘上,一些原始设备制造商(三星)喜欢这样做而不给你选择

  • 我不能称之为任何其他摄像头应用程序都可以拦截的意图,因为这样该应用程序就可以保存图像

  • 我目前的问题是,Android摄像头显然不喜欢纵向拍摄。具体来说,在一些挖掘之后,我正在监视显示器,并在旋转时调用
    setDisplayOrientation(90)
    。这可以工作,但surfaceview维度也需要更改,并且必须在支持的维度内完成,否则参数设置会使应用程序崩溃

    我用我找到的另一个SO代码片段(
    getBestPreviewSize()
    方法)来实现这一点,但它有一个明显的问题,我不敢相信我还没有发现其他人有这个问题

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


    我看不出此时如何改变静止图像显示。有人能帮我吗?

    安卓摄像头系统一团糟。由于焊接到主板上,摄像头芯片不会喜欢portait应用程序-所有回调都会以摄像头方向溢出数据(您收到的缓冲区实际上是与本机摄像头应用程序共享的内存块)-如果您希望在应用程序处于portait模式时显示它,则必须将此数据翻转到
    xy

    我将用透明的
    ImageView
    覆盖它,并在那里绘制位图,而不是在相机使用的曲面视图上显示图像


    你可能(希望)从android deamon在肖像模式下的工作中找到一些灵感,并在实时预览中绘制位图。(请从
    git
    ,因为它现在正在发布,而我正在与git和maven进行斗争,请参阅演示目录)

    查看关于如何将QR扫描仪切换为肖像的帖子:。我不知道这是否与你把照片换成肖像有关,但也许它能提供一些指导。评论11似乎是最有帮助的。(我不赞成从肖恩·欧文那里盗取QR应用程序代码)。

    我怀疑你的问题在两个不同的层面上

    传感器安装

    首先,摄像头传感器安装在每个设备上都不同。谷歌有锅炉板代码来获取方向,并设置正确的旋转值来纠正它,这在API 8中是很好的

    AR校正

    第二个问题显然是预览帧与屏幕的纵横比不同。你可以用post来解决这个问题。surfaceview维度与最佳预览大小无关,这些值不必匹配-事实上,AR混乱证明它们不匹配

    预览帧大小!=图片大小

    最后,当您使用takePicture拍摄图片时,图片的大小完全独立于预览框的大小。使用以下命令查询和设置预览帧大小: /

    使用以下命令查询和设置图片大小(来自takePicture()): /

    在某些设备上,您可能会很幸运,并且图片和预览帧的默认设置将是相同的。并非所有设备都是如此


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

    您是否可以保留以前的postview图片回调,并在实际拍摄图片时显示该回调?最后,您是否可以从拍摄的图片数据创建位图,并显示该位图而不是postview图像数据?我猜最终的图像数据是否被弄乱了,或者表面视图是否会改变你的形状。上周五,我就这样“解决”了这个问题——构建一个位图并显示它。我试图避免这种情况,因为我的应用程序已经相当密集,而且我们都知道Android在3.0之前的本地位图分配问题。但我离题了。。。感谢您抽出时间进行邮寄确认您正在SampleSize中设置BitmapFactory选项。它对解决这些内存问题有很大帮助。