【发布时间】: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对你有没有帮助