【问题标题】:Android - getSupportedPreviewSizes only returns Landscape sizesAndroid - getSupportedPreviewSizes 仅返回横向尺寸
【发布时间】:2023-02-17 01:08:19
【问题描述】:

我正在尝试构建类似于 Instagram Live 的 Live 功能。我想在纵向模式下打开相机预览全屏。我正在使用下面的设置相机预览的大小。但我只是被拉伸和扭曲了。

原因是我们从中选择要使用的最佳分辨率的 getSupportedPreviewSizes 只返回横向尺寸而不是纵向尺寸(宽度 > 高度)。

知道怎么做getSupportedPreviewSizes()改为返回支持的纵向尺寸?

 public int[] setPreviewResolution(int width, int height) {                
        mCamera = openCamera();
        
        mPreviewWidth = width;
        mPreviewHeight = height;
        Camera.Size rs = adaptPreviewResolution(mCamera.new Size(width, height));
        if (rs != null) {
            mPreviewWidth = rs.width;
            mPreviewHeight = rs.height;
        }
        
        getHolder().setFixedSize(mPreviewWidth, mPreviewHeight);
        
        mCamera.getParameters().setPreviewSize(mPreviewWidth, mPreviewHeight);

        mGLPreviewBuffer = ByteBuffer.allocate(mPreviewWidth  mPreviewHeight  4);
        mInputAspectRatio = mPreviewWidth > mPreviewHeight ?
            (float) mPreviewWidth / mPreviewHeight : (float) mPreviewHeight / mPreviewWidth;

        return new int[] { mPreviewWidth, mPreviewHeight };
    }




    private Camera.Size adaptPreviewResolution(Camera.Size resolution) {
            float diff = 100f;
            float xdy = (float) resolution.width / (float) resolution.height;
            Camera.Size best = null;
            for (Camera.Size size : mCamera.getParameters().getSupportedPreviewSizes()) {
                Log.v("widthhhhhhhhhhhdddd supported","" +" size.width: "+size.width+"   hhhh: "+size.height);
                if (size.equals(resolution)) {
                    return size;
                }
                float tmp = Math.abs(((float) size.height / (float) size.width) - xdy);
                if (tmp < diff) {
                    diff = tmp;
                    best = size;
                }
    
            }
    
            return best;
        }

【问题讨论】:

    标签: java android android-studio android-camera


    【解决方案1】:

    1- 使用 getSupportedPreviewSizes() 方法获取支持的预览尺寸。

    2- 找到高度大于宽度的预览尺寸。这将是纵向模式尺寸。

    3- 将预览尺寸设置为此纵向模式尺寸并使用setRotation(90) 旋转预览。

    4- 要使预览全屏显示,请设置用于显示相机预览以填充父级的SurfaceViewTextureView 的布局参数。

    这是一个例子:

    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    String cameraId = "0"; // Choose the desired camera ID
    CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
    StreamConfigurationMap configMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
    Size[] sizes = configMap.getOutputSizes(SurfaceTexture.class);
    Size portraitSize = null;
    
    for (Size size : sizes) {
     if (size.getHeight() > size.getWidth()) {
        portraitSize = size;
        break;
      }
    }
    
    if (portraitSize != null) {
      previewSize = portraitSize;
      int rotation = getWindowManager().getDefaultDisplay().getRotation();
      int sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
      int deviceRotation = ORIENTATIONS.get(rotation);
      int totalRotation = (sensorOrientation + deviceRotation + 360) % 360;
      previewRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, totalRotation);
    }
    SurfaceView surfaceView = findViewById(R.id.camera_preview);
    surfaceView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多