2012-11-21 197 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的協議。