Android - 相机预览是侧面的

Don*_*rty 123 camera android portrait preview orientation

我正在使用预览来显示相机在屏幕上看到的内容.

我可以使一切工作正常,表面创建,表面设置和表面显示.

但是,在纵向模式下,它始终以不正确的90度角显示图像.

如图中所示:

替代文字

我知道使用以下代码将直接设置图片:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)

但是我在Activity中有预览,其中包含其他元素,并且我的Activity在横向模式下显示没有意义.(默认禁用)

所以我想知道是否只是改变预览的方向?并在"纵向"模式下正确显示我的其余活动?

或者无论如何旋转预览以便正确显示?

Joh*_*ith 144

这个问题似乎是从某些硬件的错误开始看到的,但可以通过使用API​​ 8中可用的mCamera.setDisplayOrientation(度)调用来克服.所以这就是我实现它的方法:

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {            
    if (isPreviewRunning) {
        mCamera.stopPreview();
    }

    Parameters parameters = mCamera.getParameters();
    Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if(display.getRotation() == Surface.ROTATION_0) {
        parameters.setPreviewSize(height, width);                           
        mCamera.setDisplayOrientation(90);
    }

    if(display.getRotation() == Surface.ROTATION_90) {
        parameters.setPreviewSize(width, height);                           
    }

    if(display.getRotation() == Surface.ROTATION_180) {
        parameters.setPreviewSize(height, width);               
    }

    if(display.getRotation() == Surface.ROTATION_270) {
        parameters.setPreviewSize(width, height);
        mCamera.setDisplayOrientation(180);
    }

    mCamera.setParameters(parameters);
    previewCamera();                      
}

And the previewCamera method :

public void previewCamera() {        
    try {           
        mCamera.setPreviewDisplay(mSurfaceHolder);          
        mCamera.startPreview();
        isPreviewRunning = true;
    } catch(Exception e) {
        Log.d(APP_CLASS, "Cannot start preview", e);    
    }
}
Run Code Online (Sandbox Code Playgroud)

这是在HTC Desire上,我不得不首先在每个旋转检查中输入记录语句来说明旋转是什么,然后在设备上调试并在旋转设备时观察logCat输出.对于HTC Desire来说,0就像你预期的那样是手机(肖像),90度正在将手机转动90度逆时针(我以为它会是顺时针方向).在代码中你会看到当手机处于90度或180度时我不需要进行任何显示旋转 - 设备似乎自己处理了这个问题.只有一个点不能正常工作:270度旋转是指您将设备顺时针旋转90度并且显示旋转计数正常但如果您将设备逆时针旋转270度,则它似乎无法正确补偿.

PS注意在适当的旋转中宽度和高度的交换.

  • `mCamera.setParameters(参数);`语句崩溃我的应用程序,因为表面尺寸不是我手机的有效预览尺寸(可能是因为我保持状态栏可见?).但是,我发现使用`mCamera.setDisplayOrientation(90)`然后`mCamera.setPreviewDisplay(mSurfaceHolder);`没有设置参数也工作了! (13认同)
  • 但是setDisplayOrientation(degree); 方法支持表单2.2,低版本怎么样?parameters.setRotation(90); parameters.set("orientation","portrait"); 不工作.如果你有任何较低版本的解决方案,请帮助我. (7认同)
  • 用switch语句会更干净 (3认同)
  • 这不是假设所有设备上的预览都是侧面的吗?因为它在某些设备上是侧面的而在其他设备上是正确的....有没有办法检查设备是否默认摄像机方向与手机的纵向侧内联? (2认同)

ksu*_*ksu 16

尝试设置显示方向.它解决了我的问题.

 mCamera.setDisplayOrientation(90);
Run Code Online (Sandbox Code Playgroud)

  • 在保存时它将肖像图像保存在横向中.任何解决方案? (5认同)

小智 13

 public void surfaceCreated(SurfaceHolder holder) {
     mCamera = Camera.open();
     mCamera.setDisplayOrientation(90);
     try {
         mCamera.setPreviewDisplay(holder);
         mCamera.setPreviewCallback(new PreviewCallback() {

             @Override
             public void onPreviewFrame(byte[] data, Camera camera) {
             }
         });

     } catch (Exception e) {
         e.printStackTrace();
     }
}
Run Code Online (Sandbox Code Playgroud)

试试这段代码

  • 在保存时它将肖像图像保存在横向中.任何解决方案? (3认同)