2014-01-30 102 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