2014-01-30 105 views
1

我正在實施一個相機應用程序,將包含在一個較大的主應用程序中(主應用程序將利用所述相機應用程序,而不是依賴本機的應用程序)。關於相機方向的變化,照片未拍攝/保存

我已經設法讓它工作 - 我用Google's Camera Documentation作爲實現的基礎(所以它本質上是相同的代碼)。唯一的區別是,onPictureTaken(),我正在做的唯一的事情就是將原始數據字節數組保存到一個靜態字段(所以主應用程序可以訪問原始數據;我不想保存照片本地)。

我遇到的問題是,如果我從旋轉的手機(改變方向)內相機活動,一切都似乎是工作,但我從來沒有得到任何東西:沒有數據,沒有圖片,沒有什麼。

如果我不旋轉手機,一切工作正常;如果我在開始相機活動之前旋轉手機,再次按照預期方式工作。

我猜測它與方向改變時被重新創建的活動有關,但沒有任何我能想到的需要保存的對象;通過camera.getInstance()檢索相機對象,我總是在onCreate()

我正在使用ActionBarSherlock。

public class CamActivity extends SherlockActivity { 

    private Camera cam; 
    private CameraPreview mPreview; 
    private PictureCallback data= new PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      CamController.RAW_PIC = data; 
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getSupportActionBar().hide(); 
     setContentView(R.layout.camera_view); 

     cam= CamController.getCameraInstance(); 

     mPreview = new CamSurface(this, camera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.preview); 
     preview.addView(mPreview); 


     Button snapshot = (Button) findViewById(R.id.snapshot); 
     snapshot.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       cam.takePicture(null, null, data); 
      } 
     }); 
    } 
} 

當方位的變化,我這樣做(似乎是正確對齊SurfaceView的唯一的事情):

 Camera.Parameters parameters = camera.getParameters(); 
     Display display = activity.getWindowManager().getDefaultDisplay(); 
     int rotation = activity.getResources().getConfiguration().orientation; 
     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); 
       } 
      } 

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

顯示一些代碼。攝像機是片段還是活動? – Lefteris

+0

加入;這是一項活動。我正在使用ActionBarSherlock。主應用程序中的按鈕啓動相機活動。 – yoaquim

+0

看看[這](http://stackoverflow.com/questions/5157984/android-camera-surfaceview-orientation)可以幫助你 – Lefteris

回答

0

確保您的活動是有該清單文件中下面的代碼。

<activity 
      android:name="XXXActivity" 
      android:configChanges="orientation|screenSize|keyboard"> 
     </activity> 
+0

試過了,如果我開始縱向模式,並切換到風景,預覽變黑,看不到任何東西。該活動似乎正在運行雖然(我可以旋轉回肖像,並取回預覽)。 – yoaquim