2012-11-21 195 views
11

我创建了一个相机应用程序,我希望我的应用程序能够在所有4种可能的方向上转动,并相应地更新相机预览。对,我是用下面的方法我都抄自: Android - Camera preview is sidewaysAndroid:相机预览的屏幕方向/旋转

public void updateCameraDisplay(int w, int h) { 
     // set preview size and make any resize, rotate or 
     // reformatting changes here 

     Log.i("CameraPreviews", "Updating camera orientation with w=" + w 
       + " and h=" + h); 
     Parameters parameters = camera.getParameters(); 
     Display display = getActivity().getWindowManager() 
       .getDefaultDisplay(); 

     int rotation = getActivity().getResources().getConfiguration().orientation; 
     Log.i("CameraPreviews", "rotation is " + display.getRotation()); 
     if (display.getRotation() == Surface.ROTATION_0) { 

      parameters.setPreviewSize(h, w); 
      camera.setDisplayOrientation(0); 
     } 

     if (display.getRotation() == Surface.ROTATION_90) { 
      parameters.setPreviewSize(w, h); 
      camera.setDisplayOrientation(270); 
     } 

     if (display.getRotation() == Surface.ROTATION_180) { 
      parameters.setPreviewSize(h, w); 
      camera.setDisplayOrientation(180); 
     } 

     if (display.getRotation() == Surface.ROTATION_270) { 
      parameters.setPreviewSize(w, h); 
      camera.setDisplayOrientation(90); 
     } 

     try { 
      camera.setParameters(parameters); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我已经tweeked值,测试他们对三星Galaxy TAB2终于得到正确的方向和它所有的作品。当我在HTC的手机上试用它时,它根本不起作用!!!!!所有的e方向都是错的!所以我得出的结论是,必须是两种类型的设备(或更多...请不要!),因为旋转表示屏幕从“默认”位置旋转了多少度,然后一些设备具有一个默认位置和其他人。我怎么能找出这个默认轮换,并在我的代码中相应地执行? EJ: defaultOrientation =一些代码 如果(defaultOrientation == 0)... 否则....

锁定屏幕方向是毫无疑问的。 目标API> = 11个 非常感谢

编辑: 我已经修改我的代码:

public void updateCameraDisplay(int w, int h) { 
     // set preview size and make any resize, rotate or 
     // reformatting changes here 

     Log.i("CameraPreviews", "Updating camera orientation with w=" + w 
       + " and h=" + h); 
     Parameters parameters = camera.getParameters(); 
     Display display = getActivity().getWindowManager() 
       .getDefaultDisplay(); 

     int rotation = getActivity().getResources().getConfiguration().orientation; 
     Log.i("CameraPreviews", "screen rotation is " + rotation); 
     Log.i("CameraPreviews", "display rotation is " + display.getRotation()); 
     if (display.getRotation() == Surface.ROTATION_0) { 

      if (rotation == Configuration.ORIENTATION_LANDSCAPE) { 
       parameters.setPreviewSize(h, w); 
       camera.setDisplayOrientation(0); 
      } else { 
       parameters.setPreviewSize(h, w); 
       camera.setDisplayOrientation(90); 
      } 
     } 

     else if (display.getRotation() == Surface.ROTATION_90) { 
      if (rotation == Configuration.ORIENTATION_PORTRAIT) { 
       parameters.setPreviewSize(w, h); 
       camera.setDisplayOrientation(270); 
      } else { 
       parameters.setPreviewSize(w, h); 
       //camera.setDisplayOrientation(0); 
      } 
     } 

     else if (display.getRotation() == Surface.ROTATION_180) { 
      if (rotation == Configuration.ORIENTATION_LANDSCAPE) { 
      parameters.setPreviewSize(h, w); 
      camera.setDisplayOrientation(180); 
      }else { 
       parameters.setPreviewSize(h, w); 
       camera.setDisplayOrientation(270); 
      } 
     } 

     else if (display.getRotation() == Surface.ROTATION_270) { 
      if (rotation == Configuration.ORIENTATION_PORTRAIT) { 
       parameters.setPreviewSize(w, h); 
       camera.setDisplayOrientation(90); 
      } else { 
       parameters.setPreviewSize(w, h); 
       camera.setDisplayOrientation(180); 
      } 
     } 

     try { 
      camera.setParameters(parameters); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

更好地工作在HTC一个S和三星Galaxy Tab,只要我们不旋转手机在纵向模式下颠倒

+1

我认为为了正确实施,您还需要计算设备高度/宽度......使用角度和设备当前高度/宽度的组合,您将能够计算出确切的视图位置 – dreamcoder

+0

使用ExifInterface获取方向..it对我来说工作正常,但我没有在任何HTC设备上测试过我的代码。 – Biplab

+0

2种设备类型:http://stackoverflow.com/a/35431231/192373 –

回答

0

您需要考虑的因素包括:设备的方向,屏幕与相机之间的角度,假设您使用的是后视摄像头,以及是否启用活动感觉方向的变化。

而且一个重要的事情是制造商实施的相机HAL代码是否符合Google的协议。