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

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

到目前为止一切正常。

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

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

更新: 发生的事情是它毫无错误地接受了错误的参数,并且它返回的图像失真了,我也会尝试在此处获取图片。此外,没有运行时异常。

最佳答案

我在 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)

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

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),因此可以解决此设备上的问题。

查看相机应用源代码 where it sets the value (第 111 行)和 hardcoded sizes it prefers (第 63 行)用于确切的实现。

关于android - getSupportedPictureSize() 返回一个 Nexus4 实际上不支持的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16652712/

相关文章:

android - 多个变体的多个签名配置

android - 如何使用 Android android.provider.MediaStore.ACTION_IMAGE_CAPTURE 拍摄多张照片?

java - 如何使用 USB 线通过 Android 智能手机访问我的数码单反相机

android - 如何在 Android Camera Preview 中创建 Lomo/复古效果?

android - 在附加的堆栈跟踪中获取了资源但从未释放 - kotlin

Android:如何使用服务注册未运行的应用程序?

android - NanoHTTPD 如何将上传的文件保存到 sdcard 文件夹

java - 将 JSON 转换为 Java 类(从 Android 应用程序调用 WebApi)

Android SurfaceView 为空

android - 在 Android 中将 setZOrderOnTop 设置为 true 的 SurfaceView 顶部的按钮