2014-05-15 32 views
2

我正在开发自定义相机应用程序,并遇到方向问题。设置正确的方向以预览相机和最终结果图像

当手机处于纵向的预览画面,并导致图像显示在景观

enter image description here

当手机在左侧横向预览画面和结果正确的图像显示

enter image description here

当手机处于正确的横向位置时,预​​览屏幕和结果图像显示为横向模式,但是垂直翻转

enter image description here

我读过有关改变与setDisplayorientation方向,但我没有设法解决它。

有人可以帮助我吗?

感谢您的帮助

这是相机的活动启动预览代码

@Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     // TODO Auto-generated method stub 
     System.out.println("!!!!!!!CAMBIO!!!!!!!!"); 
     initPreview(width, height); 
     startPreview(); 
    } 


    private void initPreview(int width, int height) { 
     if (myCamera!=null && mySurfaceHolder.getSurface()!=null) { 
      try { 
       myCamera.setPreviewDisplay(mySurfaceHolder); 
      } 
      catch (Throwable t) { 
       Log.e("PreviewDemo-surfaceCallback", 
         "Exception in setPreviewDisplay()", t); 
       Toast 
       .makeText(CameraHandler.this, t.getMessage(), Toast.LENGTH_LONG) 
       .show(); 
      } 

      if (!cameraConfigured) { 
       Camera.Parameters parameters=myCamera.getParameters(); 
       Camera.Size size=getBestPreviewSize(width, height, 
         parameters); 

       if (size!=null) { 

        parameters.setPreviewSize(size.width, size.height); 

        myCamera.setParameters(parameters); 
        cameraConfigured=true; 
       } 
      } 
     } 
    } 

    private void startPreview() { 
     if (cameraConfigured && myCamera!=null) { 
      myCamera.startPreview(); 
      inPreview=true; 
     } 
    } 

private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) { 

     Camera.Size result=null; 

     for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
      System.out.println("Soportados " + size.width + "x" + size.height); 
      if (size.width<=width && size.height<=height) { 
       if (result==null) { 
        result=size; 
       } 
       else { 
        int resultArea=result.width*result.height; 
        int newArea=size.width*size.height; 

        if (newArea>resultArea) { 
         result=size; 
        } 
       } 
      } 
     } 

     return(result); 
    } 
+0

对不起,语法错误。 – Hanzo

+0

同样的问题与我的方向我张贴我的解决方案在我的文章请检查它会帮助你设置方向http://stackoverflow.com/questions/23657694/impementation-of-tuch-to-focus-on-camera-in -android – Simpalm

回答

2

setDisplayorientation()的代码示例是主文档中:

如果你想要使相机图像以与显示屏 相同的方向显示,可以使用以下代码。

public static void setCameraDisplayOrientation(Activity activity, 
     int cameraId, android.hardware.Camera camera) { 
    android.hardware.Camera.CameraInfo info = 
      new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    int rotation = activity.getWindowManager().getDefaultDisplay() 
      .getRotation(); 
    int degrees = 0; 
    switch (rotation) { 
     case Surface.ROTATION_0: degrees = 0; break; 
     case Surface.ROTATION_90: degrees = 90; break; 
     case Surface.ROTATION_180: degrees = 180; break; 
     case Surface.ROTATION_270: degrees = 270; break; 
    } 

    int result; 
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     result = (info.orientation + degrees) % 360; 
     result = (360 - result) % 360; // compensate the mirror 
    } else { // back-facing 
     result = (info.orientation - degrees + 360) % 360; 
    } 
    camera.setDisplayOrientation(result); 
} 

从API级14开始,该方法可以在预览 是活性被调用。

这不适用于用Camera.takePicture()拍摄的图片。为此,您可以使用Camera.Parameters.setRotation()。不幸的是,有些设备根据此设置EXIF旋转标志,更不幸的是,一些流行的图像浏览器忽略了这个标志。在这种情况下,您必须自己旋转生成的JPEG。为此,您可以使用Java MediaUtil库,请参阅https://stackoverflow.com/a/15302674/192373

+1

我解决了它,setRisplayOrientation后必须执行'setRotation'。谢谢 – Hanzo

相关问题