2015-05-29 114 views
0

當設備旋轉時,我試圖旋轉我的相機,iv嘗試了幾種方法,但似乎沒有一種方法適用於所有設備。Android相機旋轉通用

//這個工作對我的Nexus 5,但不是我的三星Galaxy Tab上

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
{ 
    if (mHolder.getSurface() == null) 
    { 
     return; 
    } 

    try 
    { 
     mCamera.stopPreview(); 

     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.set("orientation", "landscape"); 
     int rotation = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); 

     int orientation = getContext().getResources().getConfiguration().orientation; 

     if (rotation == Surface.ROTATION_0) { 
      if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
       mCamera.setDisplayOrientation(0); 
      } else { 
       mCamera.setDisplayOrientation(90); 
      } 
     } 
     else if (rotation == Surface.ROTATION_90) { 
      if (orientation == Configuration.ORIENTATION_PORTRAIT) { 
       mCamera.setDisplayOrientation(270); 
      } 
     } 
     else if (rotation == Surface.ROTATION_180) { 
      if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
       mCamera.setDisplayOrientation(180); 
      } 
     } 
     else if (rotation == Surface.ROTATION_270) { 
      if (orientation == Configuration.ORIENTATION_PORTRAIT) { 
       mCamera.setDisplayOrientation(90); 
      } 
     } 

     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
    } 
    catch (Exception e) { 
    } 
} 

//和我想這,這是文檔的一部分,它在我的Nexus 5不工作:

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); 
} 

有人對所有設備都有工作解決方案嗎?

+0

你是什麼意思,「它不工作」?你輸出的圖像是否被旋轉? – simekadam

+0

相機旋轉不正確。對不起,如果我不清楚我的問題。 –

回答

2

雖然我不能完全確定什麼是你的問題,從您提供的代碼,這裏有幾件事情之一已經使用Camera API和圖像旋轉Android上時,得到正確的(舊的 - 在API < 21)

1.您必須考慮圖像傳感器的orientation

傳感器的方向意味着它與設備本地使用模式的角度。 (這就是你正在使用的谷歌代碼片段的實際情況)對於手機,這通常被設置爲肖像,平板電腦上的風景。 這裏是文檔的摘錄,它可以使頭痛一陣子,但這只是事情的工作方式。

例如,假設設備具有自然高屏幕。背面照相機傳感器安裝在橫向上。你正在看屏幕。如果相機傳感器的頂部與自然方向的屏幕右邊緣對齊,則該值應爲90.如果前置攝像頭傳感器的頂部與屏幕右邊對齊,則值應爲是270

2. frontfacing相機預覽被鏡像

如果您使用frontfacing相機,你必須要在賬戶內隱鏡像。

3.這些規則只是針對旋轉攝像頭預覽

這是非常重要的。所有這些只是爲了讓您在設備屏幕上顯示正確旋轉的預覽幀。一旦拍攝了實際照片,您必須再次旋轉它以適應您的需求。對於前置圖像,這可能意味着要自己鏡像,...您可以在Android上的所有應用程序中看到這種「怪異」的結果。只需在環聊中拍照並馬上分享即可。在各種手機上,你必須得到一些奇怪的旋轉圖像。

4. OEM廠商不符合規格的所有時間

我只能說,這是沒有可能的解決方案將是hasslefree,我們得到了一些特定設備的一些問題。 (像往常一樣在Android :)

5.使用CWAC相機庫

我們發現this library是圍繞着官方的API相機卓越的包裝。幾乎解決了我提到的所有問題。

+0

嗨,感謝所有的洞察力,我可以看到他們爲什麼製作了一個新的相機API。我不會使用庫,但它是一個有用的參考。 –

+0

..回到你的問題..你有預覽問題,或由此產生的圖像?你可以看到這些是兩個不同的東西。 – simekadam

+0

我的問題是預覽,即時消息不實際去拍照。我只需要預覽 –