在 android 中设置显示方向后,相机相机预览不正确

Posted

技术标签:

【中文标题】在 android 中设置显示方向后,相机相机预览不正确【英文标题】:Camera camera preview is not Proper after setdisplayorientation in android 【发布时间】:2012-11-17 07:54:15 【问题描述】:

我正在尝试在我的应用程序中实现相机,但我发现方向预览一直是横向的,但我的应用程序是纵向的,所以我需要将它设置为纵向模式,我找到了一些解决方案,例如

mCamera.setDisplayOrientation(90); 

它在 Galaxy tab2 和 htc 上运行良好,但是当我在索尼 xperia sola 中测试它时,它显示奇怪,听到我添加了它的图像屏幕

你可以看到相机的预览仅在屏幕右侧显示

但是当我从这个应用程序拍照时,它显示正常。我不知道有什么问题 任何人都可以在这方面帮助我。

【问题讨论】:

你找到解决办法了吗? @seriakillaz 问题依然存在,所以我使用内置相机应用程序来跟踪图片。 【参考方案1】:

您可以尝试强制表面大小(和位置) - 我遵循此路径来补偿 2.2 版三星 Galaxy S 中的类似错误。当设备升级到 2.3 时修复了该错误。

【讨论】:

所以问题是我的设备操作系统 ..?(它是 4.0.4) 据我所知,这不是操作系统版本本身的功能。相机是特定于供应商和型号的。但 sw 升级可能会解决问题。 +1 感谢您的回复,但索尼没有为我的设备提供任何更新(这是最新的)所以我正在尝试重新安装 4.0.4 我希望它解决我的问题。再次感谢..【参考方案2】:

我使用以下代码解决了这个问题:

class CameraPreview extends SurfaceView implements SurfaceHolder.Callback 

    [...]

    public void show()
        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        if (!showing) 
            showing=true;
            try 
                mCamera = Camera.open();
                aspectRatio();

                try 
                    mCamera.setPreviewDisplay(mHolder);
                    mCamera.startPreview();
                    mCamera.setDisplayOrientation(90);
                 catch (IOException e) 
                    e.printStackTrace();
                
             catch (Exception e) 
                e.printStackTrace();
                Toast.makeText(getContext(), R.string.text_camera_open_error, Toast.LENGTH_SHORT).show();
            
        
    

    private void aspectRatio()
        if (!aspect_radio_corrected)
            aspect_radio_corrected=true;
            Display default_disp=((Activity)getContext()).getWindowManager().getDefaultDisplay();

            Camera.Parameters parameters = mCamera.getParameters();
            Camera.Size optimalPreviewSize=parameters.getPreviewSize();

            FrameLayout.LayoutParams l_params=(FrameLayout.LayoutParams)getLayoutParams();
            float ratio = (float) optimalPreviewSize.height / optimalPreviewSize.width;
            l_params.width=default_disp.getWidth();
            l_params.height=Math.round(l_params.width / ratio);
            setLayoutParams(l_params);
            requestLayout();
        
    

    [...]

在我的布局文件上:

<com.socialcoaster.utils.CameraPreview
    android:id="@+id/cameraView"
    android:background="@android:color/transparent"
    android:layout_
    android:layout_ />

似乎这是一个与相机上当前预览大小设置的纵横比和要显示它的surfaceView区域相关的错误。您只需将aspectRatio() 的值更改为100 等固定值即可看到。

【讨论】:

以上是关于在 android 中设置显示方向后,相机相机预览不正确的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 如何在 Android 中设置全屏相机视图?

Android:编码的相机预览帧总是横向的。如何旋转?

尝试在 SurfaceView 中设置时拉伸相机预览

在android中设置相机拍摄的图像?

从相机拍照后图像未在 ImageView 中设置

Android:在方向更改时保留相机预览,而其他视图可以旋转