在相机方向更改时,未拍摄/保存照片

时间:2014-01-30 14:42:00

标签: android camera

我正在实施一个相机应用程序,它将包含在一个更大的主应用程序中(主应用程序将使用所述相机应用程序,而不是依赖于原生应用程序)。

我设法让它工作 - 我使用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);
                }
            }

1 个答案:

答案 0 :(得分:0)

确保您的活动在清单文件中包含以下代码。

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