If I change left-side-base to right-side-base (both are landscape view modes for user) the application (activity) doesn't recreate. Hense, the camera is shown as horizontaly flipped image. The same result when I try to change position of my device for two portrait modes (normal and inverse). The device detects 90 degree rotation normaly. That is, left-side => portrait => right-size => inverse-portrait => left-side works correctly!
Is it possible to fix this?
I am using Android 4.4.4.
Code:
Display display = ((WindowManager)context.getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0){//0
mCamera.setDisplayOrientation(90);
}else if(display.getRotation() == Surface.ROTATION_90){//1
mCamera.setDisplayOrientation(0);
}else if(display.getRotation() == Surface.ROTATION_180){//2
mCamera.setDisplayOrientation(270);
}else if(display.getRotation() == Surface.ROTATION_270){//3
mCamera.setDisplayOrientation(180);
}
Log.d(TAG, "ROTATION:" + display.getRotation() + " ");
EDIT
I mean, onResume()
and SurfaceCreate()
are never call when I rotate the device by 180 degs.
EDIT CODE OF FUNCTIONS
SurfaceView sfv;
FrameLayout fl0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//some code to initialize
fl0 = (FrameLayout) findViewById(R.id.fl0);
sfv = new SurfaceView(this);
fl0.addView(sfv, 0);
addSurfaceHolder();
}
private void addSurfaceHolder() {
SurfaceHolder holder = sfv.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.d(TAG, TAG + " surfaceCreated");
//this function never calls for 180 deg rotation.
cameraStart(MainActivity.this, false);
//some code for camera holder connection
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
Log.d(TAG, TAG + " surfaceChanged");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
///Some code to destroy camera
Log.d(TAG, TAG + " surfaceDestroyed");
}
});
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, TAG + " onResume"); //call for 90 deg rotation. not for 180 deg rotation.
}
public static void cameraStart(Context context, boolean startStopPreview) {
if (mCamera == null) {
mCamera = Camera.open(CAMERA_ID); //0
}
Camera.Parameters cameraParam = mCamera.getParameters();
Camera.Size previewSize = cameraParam.getPreviewSize();
previewFormat = cameraParam.getPreviewFormat();
frameWidth = previewSize.width;
frameHeight = previewSize.height;
frameRect = new Rect(0, 0, frameWidth, frameHeight);
Display display = ((WindowManager) context.getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if (display.getRotation() == Surface.ROTATION_0) { //0
mCamera.setDisplayOrientation(90);
} else if (display.getRotation() == Surface.ROTATION_90) { //1
mCamera.setDisplayOrientation(0);
} else if (display.getRotation() == Surface.ROTATION_180) { //2
mCamera.setDisplayOrientation(270);
} else if (display.getRotation() == Surface.ROTATION_270) { //3
mCamera.setDisplayOrientation(180);
}
Log.d(TAG, "ROTATION:" + display.getRotation() + " "); //just calles for 90 deg rotation. not for 180 deg.
}