我正在实施一个相机应用程序,它将包含在一个更大的主应用程序中(主应用程序将使用所述相机应用程序,而不是依赖于原生应用程序)。
我设法让它工作 - 我使用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 :(得分:0)
确保您的活动在清单文件中包含以下代码。
<activity
android:name="XXXActivity"
android:configChanges="orientation|screenSize|keyboard">
</activity>