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

我已经扩展了一个SurfaceView来显示一个非常简单的摄像头应用程序的摄像头。 为了find每个设备的最佳预览尺寸,我使用了几乎所有我见过的开源相机应用程序中使用的示例代码:

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); } } 

一切都完美到这一点。

现在,由于应用程序的性质,我必须在会话过程中保留两个位图,并且为了简单起见(避免了testing期间的内存问题),我使用了PICTURE SIZE的相同代码getSupportedPreviewSizes()与getSupportedPictureSizes())。 在大多数设备上,一切都很好用,但是我必须select其他方式来为每个设备select最佳的图片尺寸。

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

更新:发生了什么是它接受错误的参数没有任何错误,它返回的图像是扭曲的,我也会尝试在这里得到一个图片。 另外,没有运行时exception。

Solutions Collecting From Web of "getSupportedPictureSize()返回一个Nexus4实际不支持的值"

我在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() ,相机硬件不会抛出错误,但会返回一个失真的图像:

来自LG Lucid的扭曲结果的样本,显示出似乎是用错误的步幅解释的像素缓冲区

我尝试了一些技术来让摄像头驱动程序承认这个尺寸并不真正被支持,包括在调用setParameters()之后检查getPictureSize()getSupportedPictureFormats()的结果。 我找不到任何放弃这种行为的东西。

要解决这个问题,我们现在模仿相机应用程序的行为:我们试图从getSupportedPictureSizes()列表中find一个“首选”大小,然后再回到select最大(由width * height计算)。 由于首选尺寸的长宽比都是1.333(4:3),所以这个设备的问题就是围绕这个问题展开的。

请参阅相机应用程序源,在其中设置值 (第111行)和硬件代码大小 (第63行)以确切实现。

我相信1280×960图片是由Nexus 4上的辅助人脸相机支持的。我不知道为什么设备会报告“混合”的尺寸,通常每个相机都会自己回答。

我可以确认有一些设备是关于他们的相机function的,但是我对预览尺寸比图片尺寸有更多的经验。

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

Nexus 4的另一个“不错的”function在于它显然对android.camera.frontfunction非常敏感(请参阅正面相机图像失真 )

我用Nexus 4 v.4.2.2(JDQ39)复制了你的逻辑。 1280×960或者相机的图片尺寸都没有问题。 请注意,图片的方向并不完全符合人们的期望,但是您的问题并没有提到相机的方向。

实际上有什么,但总结:谢谢谷歌!

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

在我的testing场景中,带有4.3的Nexus 4和带有4.4的另一个支持1.33, 但是 1.77 …

我不能说有多less设备在那里,或者其实是不支持的types(以上提到不同的方式)..所以基本上只有选项。 让用户决定。 如果有问题 – >提供一个选项来改变宽高比。

我现在这样做了。

希望这可以帮助别人 – > 祝你好运:)