【问题标题】:Full screen camera preview in portrait mode on Android 4.3Android 4.3 纵向模式下的全屏相机预览
【发布时间】:2015-04-12 09:31:03
【问题描述】:

我正在使用 Intel Inde 媒体库(特别是此示例:https://github.com/INDExOS/media-for-mobile/blob/master/Android/samples/apps/src/com/intel/inde/mp/samples/CameraCapturerActivity.java

我的目标是在纵向模式下设置全屏预览并以纵向模式录制视频。在横向模式下一切都很好(全屏预览和录制)。但是在纵向模式下,我无法拉伸预览以垂直填充屏幕(即使我将表面视图设置为最大尺寸)。我得到的最大尺寸是方形图像预览。我尝试让表面视图大于屏幕,但仍然坚持方形预览和录制。

这是我的预览屏幕目前的样子: http://imgur.com/XUznvF1

这是我的代码:

public void createCamera() 
{
    Camera camera = Camera.open();
    Camera.Parameters parameters = camera.getParameters();

    List<Camera.Size> supportedResolutions = camera.getParameters().getSupportedPreviewSizes();
    parameters.setPreviewSize(supportedResolutions.get(0).width,   
    supportedResolutions.get(0).height);
    camera.setDisplayOrientation(90);  
    camera.setParameters(parameters);
}

public void createPreview() 
{
     GLSurfaceView surfaceView = new GLSurfaceView(getActivity().getApplicationContext());

     //This code is used to get display size to set surface view size
     Display display = getActivity().getWindowManager().getDefaultDisplay();
     Point size = new Point();
     display.getSize(size);
     int width = size.x;
     int height = size.y;

     surfaceView.setLayoutParams(new FrameLayout.LayoutParams(width, height));

     //Used to test that the surfaceview does cover the whole screen
     //surfaceView.setBackgroundColor(Color.RED);

     ((RelativeLayout)view.findViewById(R.id.myview)).addView(surfaceView, 0);

     preview = capture.createPreview(surfaceView, camera);
     preview.start();           
 }

【问题讨论】:

  • 您希望它扭曲以垂直填充屏幕,还是保持正确的纵横比?
  • 我想要正确的纵横比并垂直填充(如果我使用默认相机应用并获得全屏无失真预览,则类似)

标签: android opengl-es android-camera surfaceview intelinde


【解决方案1】:

英特尔开发者网站上有一个线程,似乎是同样的问题。他们有解决方案,但您必须通过电子邮件请求库更新:

https://software.intel.com/en-us/forums/topic/542633

【讨论】:

    【解决方案2】:

    我认为您的问题是您将相机的预览尺寸设置为支持尺寸列表中的第一个尺寸。

    List<Camera.Size> supportedResolutions = camera.getParameters().getSupportedPreviewSizes();
    parameters.setPreviewSize(supportedResolutions.get(0).width, supportedResolutions.get(0).height);
    

    您应该做的是遍历支持的尺寸列表并找到与屏幕尺寸/分辨率非常匹配的尺寸。

    你可以查看this SO answer获取示例代码sn-ps

    更新

    下一步是调试它并找出它不适合您的原因。在您的情况下,我会做的是打印出supportedResolutions 列表的内容。由于您已经有了显示尺寸,我会将显示尺寸与supportedResolutions 列表中的不同尺寸以及getOptimalSize 方法返回的尺寸进行比较。 getOptimalSize 方法可能没有找到最佳大小,并且可能需要根据您的需要调整该方法。我调整了我的让它工作。

    如果您需要更多帮助,请告诉我。

    【讨论】:

    • iRuth,我已经从你提到的 SO 答案中实现了 getOptimalSize() 方法,结果还是一样。没有区别:(
    • 如果这有什么不同的话,我正在一台 HTC 上调试。我添加了一些调试行,并且可以确认 getOptimalSize 确实返回了有效的大小(1920x1088)。您是否在纵向模式下获得全屏预览?
    • 是的,我确实在纵向模式下获得了全屏预览。
    • 您使用的是 GLSurfaceView 还是其他?你介意分享你的代码吗?也许我错过了什么。
    • @nyc0202034 不,我使用的是SurfaceView,但我认为这无关紧要。 display 在您的 createPreview 方法中返回的大小是多少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多