2015-05-06 17 views
0

我正在將相機實現到我的應用中。除了一件事情之外,一切都運作良好,當將顯示器從風景旋轉到顛倒風景時,表面視圖不會更新(從逆風景旋轉到正常風景時,表面視圖不會更新)。不調用surfaceChanged,因此,預覽顯示顛倒。如果我將顯示器從縱向旋轉到橫向或反轉橫向,它都可以完美地工作。如何修復從橫向切換到反向橫向時的倒置相機預覽

我試圖在我的CameraActivity(它擴展了ActionBarActivity)中使用onConfigurationChange來捕獲此問題,但在方向從正常風景改變爲反轉風景(或其他方式)的情況下不會調用此方法。我瞭解到這是因爲在這種情況下配置實際上沒有改變。方向仍然是風景和屏幕大小不會改變,因此,onConfigurationChange不叫...

接下來,我決定嘗試使用OrientationEventListener完成此操作,但我似乎無法訪問相機從這個監聽器中:

mOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) { 

     @Override 
     public void onOrientationChanged(int orientation) { 

      // determine our orientation based on sensor response 
      int lastOrientation = mOrientation; 

      DisplayMetrics displaymetrics = new DisplayMetrics(); 
      Display display = getWindowManager().getDefaultDisplay(); 
      int rotation = display.getRotation(); 
      getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 

      int height = displaymetrics.heightPixels; 
      int width = displaymetrics.widthPixels; 

      if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) { 
       if (mCamera == null) 
        mCamera = Camera.open(CameraInfo.CAMERA_FACING_BACK); 

       int angleToRotate = getRoatationAngle(); 
       mCamera.setDisplayOrientation(angleToRotate); 
       initPreview(width, height); 
       startPreview(); 
      } 
     } 
    }; 

我不斷收到一個NullPointerException因爲mCamera爲空時onOrientationChanged被調用。我已經在上面的代碼中看到了這個null,但是當調用Camera.open()時,我的應用程序崩潰了。嘗試使用Camera.open()在onOrientationChanged中設置mCamera時發生NullPointerException。

我也試過從OrientationEventListener中調用surfaceChanged,併發生完全相同的問題。當我嘗試在surfaceChanged中設置null mCamera變量時,只發生NullPointerException。

有沒有人有一個想法如何解決這個問題?

回答

0

我決定以不同的方式實現這一點。而不是允許活動和預覽方向改變,它們現在都被鎖定。使用AndroidManifest.xml將活動鎖定爲縱向,並且預覽在常規橫向模式下鎖定,並且在旋轉手機時,我使用OrientationEventListener確定旋轉角度並調整輸出圖像以及快門按鈕的旋轉,以便它感覺就像改變了方向,但實際上活動和預覽保持相同的方向。

這工作完美無瑕,並阻止我不必執行不必要的代碼。此方法還可消除重新加載活動時方向更改的延遲,因爲活動不再經歷方向更改並且不會調用onCreate()。

相關問題