Я решил проблему с onconfigurationchanged. Хитрость заключается в том, что в соответствии с жизненным циклом активности андроида, когда вы явно называете намерение (намерение камеры или любое другое); действие приостанавливается, и в этом случае вызывается onsavedInstance. При вращении устройства в другое положение, отличное от того, в котором активна активность; выполнение операций фрагмента, таких как фиксация фрагмента, вызывает исключение из нелегального состояния. Есть много жалоб на это. Это что-то вроде управления жизненным циклом активности Android и правильных вызовов методов. Чтобы решить эту проблему, я сделал следующее: 1-Переопределите метод onsavedInstance вашей активности и определите текущую ориентацию экрана (портретную или альбомную), а затем установите ориентацию экрана перед ее приостановкой активности. таким образом, вы заблокируете поворот экрана для своей активности, если он был повернут другим. 2, затем переопределите метод onresume активности и настройте режим ориентации теперь на датчик, чтобы после вызова метода onsaved он будет вызывать еще один раз при настройке для правильного вращения.
Вы можете копировать / вставьте этот код в свою деятельность, чтобы справиться с этим:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Toast.makeText(this, "Activity OnResume(): Lock Screen Orientation ", Toast.LENGTH_LONG).show();
int orientation =this.getDisplayOrientation();
//Lock the screen orientation to the current display orientation : Landscape or Potrait
this.setRequestedOrientation(orientation);
}
//A method found in stackOverflow, don't remember the author, to determine the right screen orientation independently of the phone or tablet device
public int getDisplayOrientation() {
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = getOrient.getOrientation();
// Sometimes you may get undefined orientation Value is 0
// simple logic solves the problem compare the screen
// X,Y Co-ordinates and determine the Orientation in such cases
if (orientation == Configuration.ORIENTATION_UNDEFINED) {
Configuration config = getResources().getConfiguration();
orientation = config.orientation;
if (orientation == Configuration.ORIENTATION_UNDEFINED) {
// if height and widht of screen are equal then
// it is square orientation
if (getOrient.getWidth() == getOrient.getHeight()) {
orientation = Configuration.ORIENTATION_SQUARE;
} else { //if widht is less than height than it is portrait
if (getOrient.getWidth() < getOrient.getHeight()) {
orientation = Configuration.ORIENTATION_PORTRAIT;
} else { // if it is not any of the above it will defineitly be landscape
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
}
}
return orientation; // return value 1 is portrait and 2 is Landscape Mode
}
@Override
public void onResume() {
super.onResume();
Toast.makeText(this, "Activity OnResume(): Unlock Screen Orientation ", Toast.LENGTH_LONG).show();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}