Android 安卓4.3上人像模式下的全屏相机预览

Android 安卓4.3上人像模式下的全屏相机预览,android,opengl-es,android-camera,surfaceview,intelinde,Android,Opengl Es,Android Camera,Surfaceview,Intelinde,我正在使用“英特尔Inde媒体库”(特别是本例:) 我的目标是在纵向模式下设置全屏预览,并在纵向模式下录制视频。在横向模式下(全屏预览和录制),一切都很好。但是,在纵向模式下,我无法拉伸预览以垂直填充屏幕(即使我将曲面视图设置为最大大小)。我得到的最大尺寸是方形图像预览。我已经尝试过使表面视图比屏幕更大,但仍然坚持使用方形预览和录制 这就是我的预览屏幕当前的样子: 这是我的密码: public void createCamera() { Camera camera = Camera.

我正在使用“英特尔Inde媒体库”(特别是本例:)

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

这就是我的预览屏幕当前的样子:

这是我的密码:

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();           
 }
public void createCamera()
{
Camera=Camera.open();
Camera.Parameters=Camera.getParameters();
List supportedResolutions=camera.getParameters().getSupportedPreviewSizes();
parameters.setPreviewSize(supportedResolutions.get(0).width,
支持的分辨率。获取(0)。高度);
摄像头。设置显示方向(90);
设置参数(参数);
}
public void createPreview()
{
GLSURFACHEVIEW SURFACHEVIEW=新建GLSURFACHEVIEW(getActivity().getApplicationContext());
//此代码用于获取显示大小以设置曲面视图大小
显示显示=getActivity().getWindowManager().getDefaultDisplay();
点大小=新点();
display.getSize(size);
int width=size.x;
整数高度=大小y;
setLayoutParams(新的FrameLayout.LayoutParams(宽度、高度));
//用于测试surfaceview是否覆盖整个屏幕
//surfaceView.setBackgroundColor(颜色:红色);
((RelativeLayout)view.findViewById(R.id.myview)).addView(surfaceView,0);
预览=捕获。创建预览(surfaceView,摄像头);
preview.start();
}

我认为您的问题在于,您正在将相机的预览大小设置为支持大小列表中的第一个大小

List<Camera.Size> supportedResolutions = camera.getParameters().getSupportedPreviewSizes();
parameters.setPreviewSize(supportedResolutions.get(0).width, supportedResolutions.get(0).height);
List supportedResolutions=camera.getParameters().getSupportedPreviewSizes();
parameters.setPreviewSize(supportedResolutions.get(0).宽度,supportedResolutions.get(0).高度);
您应该做的是循环浏览支持的大小列表,找到与屏幕大小/分辨率非常匹配的大小

您可以检查示例代码段

更新

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


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

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


你想让它扭曲以垂直填充屏幕,还是保留正确的纵横比?我想要正确的纵横比并垂直填充(如果我使用默认的摄像头应用程序并获得全屏无失真预览,则类似)iRuth,我已经根据你提到的SO答案实现了getOptimalSize()方法,结果仍然是一样的。没有区别:(如果有区别的话,我正在HTC one上调试。我添加了一些调试行,可以确认getOptimalSize确实返回了有效的大小(1920x1088)。您在纵向模式下获得全屏预览吗?是的,我在纵向模式下获得了全屏预览。您使用的是GLSurfaceView还是其他什么?您介意分享您的代码吗?可能我遗漏了一些内容。@nyc0202034不,我使用的是
SurfaceView
,但我认为这不重要。显示返回的大小是多少在您的
createPreview
方法中?