【问题标题】:On Camera orientation change, photo not taken/saved在相机方向更改时,照片未拍摄/保存
【发布时间】:2014-01-30 23:19:28
【问题描述】:

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

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

【问题讨论】:

  • 显示一些代码。相机也是片段还是活动?
  • 已添加;这是一项活动。我正在使用 ActionBarSherlock。主应用程序中的一个按钮启动相机活动。
  • 看看this对你有没有帮助

标签: android camera


【解决方案1】:

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

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

【讨论】:

  • 试过了,如果我从纵向模式开始并切换到横向,预览会变暗,什么都看不到。活动似乎正在运行(我可以旋转回纵向并取回预览)。
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2015-11-06
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
相关资源
最近更新 更多