getSupportedPictureSize()返回Nexus4实际上不支持的值

时间:2013-05-20 15:17:46

标签: android android-camera surfaceview nexus-4

我已经扩展了SurfaceView,用于显示非常简单的相机应用程序的相机输入。为了找到每个设备的最佳预览大小,我使用了这个示例代码,该代码几乎用于我见过的所有开源相机应用程序:

    List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
    double minDiff = Double.MAX_VALUE;
    for (Camera.Size size : sizes) {
        if (Math.abs(size.width - width) < minDiff) {
        screenWidth = size.width;
        screenHeight = size.height;
        minDiff = Math.abs(size.width - width);
        }
    }

到目前为止,一切都运作良好。

现在,由于应用程序的性质,我必须在会话过程中在内存中保留两个位图,并且为了简单起见(避免在测试期间出现内存问题)我对PICTURE SIZE使用了相同的代码(用getSupportedPictureSizes()替换了getSupportedPreviewSizes())。虽然我必须通过其他方式为每种设备选择最佳的图片尺寸,但在大多数设备上一切都运行良好。

最近,在Nexus 4设备上进行测试时,上述循环无法选择最佳图片尺寸。经过调查,我发现getSupportedPictureSizes()函数返回一个值,即1280 * 960,而Nexus 4相机实际上并不支持它。那么,如何解决这个问题呢?我的意思是,这个函数不应该只返回设备的CAMERA支持的值吗?我相信会有其他设备出现同样的问题我无法测试。关于如何解决这个问题的任何线索?

更新: 发生的事情是,它接受错误的参数没有任何错误,它返回的图像是扭曲的,我也会尝试在这里得到一张图片。此外,没有运行时异常。

3 个答案:

答案 0 :(得分:6)

我在LG Lucid(型号VS840 4G)上遇到了同样的问题。基本上,getSupportedPictureSizes()会返回以下尺寸:

Size        Aspect Ratio
2560x1920   (1.3333333333333333)
3072x1728   (1.7777777777777777)
2048x1536   (1.3333333333333333)
2304x1296   (1.7777777777777777)
1536x864    (1.7777777777777777)
1280x960    (1.3333333333333333)
640x480     (1.3333333333333333)

如果我们使用1.7宽高比的任何尺寸调用setPictureSize(),相机硬件不会抛出任何错误,但会返回失真的图像:

sample of distorted result from LG Lucid, showing what appears to be a pixel buffer interpreted with the wrong stride

我尝试了一些技巧让相机驱动程序承认这个尺寸并不是真的支持,包括在调用getPictureSize()后检查getSupportedPictureFormats()setParameters()的结果。我找不到任何可以解除这种行为的东西。

要解决这个问题,我们现在模仿相机应用程序的行为:我们尝试从getSupportedPictureSizes()列表中找到“首选”尺寸,然后再回到选择最大尺寸(按宽度*高度计算) )。由于首选尺寸的纵横比均为1.333(4:3),因此可解决此设备的问题。

请参阅相机应用来源[{3}}(第111行)和where it sets the value(第63行)以获取具体实施方案。

答案 1 :(得分:1)

我相信Nexus 4上的辅助相机支持1280x960图像。我不知道为什么设备会报告“混合”尺寸,通常每个相机都会自行回答。

我可以确认有一些设备与他们的相机功能有关,虽然我对预览尺寸的经验比图片尺寸更多。

当您选择错误的尺寸时,可能会发生不同的事情。有时,如果选择不受支持的大小,您将在camera.setParameters()上获得RuntimeException。有时,设备会默默接受参数,但如果您在此之后询问getParameters(),您会发现图片大小没有变化,或者不是您要求的。有些设备更进一步:他们假装设置所需的尺寸,但实际输出是不同的。例如。 Galaxy Nexus假装支持320x240视频,但预览回调中的缓冲区大小为640x480。

Nexus 4的另一个“不错”功能是它显然对android.camera.front功能很敏感(参见Frontal Camera Image Distortion

我用Nexus 4 v.4.2.2(JDQ39)复制了你的逻辑; 1280x960相机的图片大小没有问题。请注意,图片方向并不完全符合人们的预期,但您的问题并未提及摆弄相机方向。

答案 2 :(得分:1)

实际上是什么, 但总结一下: 谢谢谷歌!

  • 某些设备支持1.33
  • 某些设备支持1.77

在我的测试场景中,一个4.3和另一个4.4的Nexus 4都支持1.33, 1.77 ...

我不能说有多少设备在那里,或者哪个实际上是不受支持的类型(上面提到不同的方式)..所以基本上只有选项。 让用户决定。如果有问题 - &gt;提供改变宽高比的选项。

我现在这样做了。

希望这有助于某人 - &gt; 祝你好运:)