我正在实施一个相机应用程序,将包含在一个较大的主应用程序中(主应用程序将利用所述相机应用程序,而不是依赖本机的应用程序)。关于相机方向的变化,照片未拍摄/保存
我已经设法让它工作 - 我用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);
}
}
显示一些代码。摄像机是片段还是活动? – Lefteris
加入;这是一项活动。我正在使用ActionBarSherlock。主应用程序中的按钮启动相机活动。 – yoaquim
看看[这](http://stackoverflow.com/questions/5157984/android-camera-surfaceview-orientation)可以帮助你 – Lefteris