无效的Android拍摄照片大小

无效的Android拍摄照片大小,android,camera,Android,Camera,我不明白为什么当我使用Android camera API拍摄照片时,拍摄的照片与预览不匹配 对于预览,我使用大小为817 x 770像素的FrameLayout。 对于前置摄像头,我选择了1280 x 768像素的预览大小。 由于我希望有一个覆盖整个预览区域的相机预览,我设置了一个尺寸为1283 x 770像素(保持支持的预览帧的纵横比)的帧布局,该布局以其父帧(817 x 770帧布局)为中心: 因此,我希望预览有点中断,但确实居中。 事实并非如此。当我拍照片的时候,我可以清楚地看到预览中间

我不明白为什么当我使用Android camera API拍摄照片时,拍摄的照片与预览不匹配

对于预览,我使用大小为817 x 770像素的FrameLayout。 对于前置摄像头,我选择了1280 x 768像素的预览大小。 由于我希望有一个覆盖整个预览区域的相机预览,我设置了一个尺寸为1283 x 770像素(保持支持的预览帧的纵横比)的帧布局,该布局以其父帧(817 x 770帧布局)为中心:

因此,我希望预览有点中断,但确实居中。 事实并非如此。当我拍照片的时候,我可以清楚地看到预览中间的东西不是拍摄照片的中间部分:

对于本例,笔的末端位于预览区域的左上角和右下角。在拍摄的照片中,它们不是。左边有一个巨大的空白+右边有一个较小的空白

我用来重现行为的代码(从带有一些硬编码值的较大片段中提取)可以在这里找到:

问题是我不能假设预览区域与支持的相机预览大小的比率匹配,我不希望有空白区域。我选择丢失一块预览区域。用户不在乎30px在两边都丢失了:)但我找不到预览在整个图片中如此奇怪的位置的原因

该代码在Nexus 7(2013)上运行

我的活动布局如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${packageName}.${activityClass}">

    <FrameLayout
        android:id="@+id/rootView"
        android:layout_width="817px"
        android:layout_height="770px"
        android:layout_marginLeft="1050px"
        android:layout_marginTop="168px"
        android:background="#770000" />
    </FrameLayout>
</FrameLayout>

如果预览文件夹边界超出屏幕边界,则会出现问题。如果我将预览区域向左移动,使左边距和右边距大于或等于(1283-817)/2,那么它看起来很好。

如何设置布局?你可以尝试负边距。使用负边距(而不是重力)也是一样的。在这种情况下,我建议尝试(去润滑)绝对布局。当我真的需要时,我成功地用这种方法强制“裁剪”了相机视图,但这是在三星Galaxy S设备上的OS build 2.3(甚至不是2.3.3)上实现的。这样的设置非常特定于设备和构建。更普遍的方法是使用TextureSurface(API级别11):具有任何边距和拉伸的OpenGL设置仅使用文档化的功能。谢谢,我将尝试使用此TextureSurface,因为我的目标是API级别16
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${packageName}.${activityClass}">

    <FrameLayout
        android:id="@+id/rootView"
        android:layout_width="817px"
        android:layout_height="770px"
        android:layout_marginLeft="1050px"
        android:layout_marginTop="168px"
        android:background="#770000" />
    </FrameLayout>
</FrameLayout>
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(width, height);
layoutParams.gravity = Gravity.CENTER;
FrameLayout previewHolder = new FrameLayout(this);
previewHolder.setLayoutParams(layoutParams);

FrameLayout rootView = (FrameLayout)findViewById(R.id.rootView);
rootView.addView(previewHolder);

ViewGroup.LayoutParams paramsRoot = rootView.getLayoutParams();
Log.d("TEST", "Root: " + paramsRoot.width + " x " + paramsRoot.height);
Log.d("TEST", "Preview: " + width + " x " + height);

previewHolder.addView(cameraPreview);