Android自定义相机结果图像方向

Android自定义相机结果图像方向,android,camera,Android,Camera,我正在编写一个自定义相机应用程序,遵循本教程: 现在我可以使用相机,在用户点击按钮后获取图像数据。 但是我遇到了预览是横向的问题,所以我在surfaceCreated中添加了以下代码 @Override public void surfaceCreated(SurfaceHolder holder) { // Open the camera when the preview is created Log.d("Callback", "[surfaceCreated]");

我正在编写一个自定义相机应用程序,遵循本教程:

现在我可以使用相机,在用户点击按钮后获取图像数据。 但是我遇到了预览是横向的问题,所以我在surfaceCreated中添加了以下代码

@Override
public void surfaceCreated(SurfaceHolder holder) {
    //  Open the camera when the preview is created
    Log.d("Callback", "[surfaceCreated]");
    theCamera = Camera.open();

    Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
    int displayRotation = display.getRotation();
    switch (displayRotation)  {
        case Surface.ROTATION_0:        theCamera.setDisplayOrientation(90);    break;
        case Surface.ROTATION_90:       break;
        case Surface.ROTATION_180:      break;
        case Surface.ROTATION_270:      theCamera.setDisplayOrientation(180);   break;
    }
}
预演很好。 但是,当我获取图像数据时,我使用
BitmapFactory.decodeByteArray
获取位图,并将其设置为在xml布局中定义的imageView

这是我的main.xml


previewSurfaceView是用于相机预览的小视图

button1和button2是我单击时的按钮,相机捕获图像并设置与imageView1/imageView2对应的imagedata

存在一些问题:

  • 我将布局宽度和高度以及最大宽度和高度设置为100dp,将比例类型设置为fitCenter。但它似乎不是我想要的。我希望图像显示在边界内。我在布局设置上做错了吗

  • 即使我以纵向模式拍照,图像也始终处于横向

  • 此外,我想添加一个按钮来切换相机的开/关,但我不知道如何操作。


    有人能为我提出解决办法吗?谢谢。

    请查看我的答案,因为它似乎与您遇到的问题相同。

    您需要在camera parameter对象上调用方法
    setRotation
    ,然后在camera上设置参数

    执行
    OrientationListener
    获取旋转,在
    setRotation


    示例代码用法。

    对不起,我在上面发布了错误的代码。我在曲面视图中没有问题。但是我怎样才能得到图像数据的方向呢。似乎我无法从数据中获取EXIF。我使用硬代码尝试了0、90、180和270。但图像数据始终处于横向。我希望图像始终在纵向模式下拍摄,并显示为纵向模式,以将设备保持在potrait模式,并将旋转设置为90,您应该在纵向模式下拍摄照片。
    <SurfaceView
        android:id="@+id/previewSurfaceView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center" />
    
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="250px" >
    
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="Button" />
    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            android:maxHeight="100dp"
            android:maxWidth="100dp"
            android:scaleType="fitCenter"
            android:src="@drawable/ic_launcher" />
    
    </LinearLayout>
    
    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="fill_parent"
        android:layout_height="250px" >
    
        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="Button" />
    
        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            android:maxHeight="100dp"
            android:maxWidth="100dp"
            android:scaleType="fitCenter"
            android:src="@drawable/ic_launcher" />
    
    </LinearLayout>