Samsung Galaxy Tab 7.0 перезапускает приложение по возвращении из камеры - PullRequest
1 голос
/ 22 декабря 2011

Мой код работает должным образом на устройствах меньшего и большего размера (Motorola Xoom, Samsung Galaxy Player 4.0, Kyocera Digno), но для Samsung Galaxy Tab 7.0, после запуска намерения ACTION_IMAGE_CAPTURE и фотографирования, когда приложение возвращаетсяonDestroy() вызывается, затем onCreate(), , затем вызывается onActivityResult(), и, наконец, onDestroy() и onCreate() вызывают снова, что, конечно, нежелательно - только onActivityResult() должен

Возможные подсказки:

  • Galaxy Tab 7.0 имеет размер экрана, который не поддерживается в файле манифеста (это единственное устройство, которое я тестировал снеподдерживаемый размер экрана), поэтому пользователь может выбрать «растянуть по размеру» или «по размеру».Оба интерфейса имеют одинаковое (плохое) поведение.
  • При предварительном просмотре изображения активность камеры, похоже, меняет ориентацию.Мое приложение поддерживает только портретный режим ( edit: на небольших экранах - на не больших экранах оно поддерживает изменение ориентации).Возможно, изменение ориентации как-то разрушает мою деятельность.
  • Я попытался запустить и вернуться с другого намерения (намерения электронной почты), и мое приложение в этом случае не уничтожается и не создается заново.

Дайте мне знать, если требуется дополнительная информация или пример кода.

Редактировать: проблема была сужена до изменения ориентации.Согласно ответу Картика, установка android:configChanges="orientation" устраняет проблему.Единственная проблема в том, что мое приложение поддерживает изменение ориентации на больших экранах.Этот параметр нарушает эту функциональность на этих устройствах.Я попытался использовать android:configChanges="@string/config_changes" и предоставить другую строку в зависимости от размера экрана, но теперь я получаю «Ошибка установки: INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION».В соответствии с этим, Android Activity, как переопределить Android манифеста: configChanges с кодом Java? , нет способа установить его программно.Мой единственный вариант - обрабатывать все изменения ориентации в моем приложении вручную?

Ответы [ 2 ]

2 голосов
/ 18 апреля 2012

Я обнаружил, что причина, по которой мое приложение перезагружается, заключается в том, что устройству не хватает памяти при запуске приложения камеры, а ОС перезапустила мою основную активность. Это не было бы проблемой, за исключением того, что у меня был макет на основе фрагментов, и некоторая инициализация фрагмента выполнялась в onCreate(), независимо от saveInstanceState. Это привело к тому, что автоматическое восстановление фрагмента было отменено, и приложение выглядело так, как будто оно перезапускалось с самого начала, хотя на самом деле оно просто пыталось восстановить.

Ex:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // add main menu -- WRONG!
    MainMenuFragment mainMenu = new MainMenuFragment();
    FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
    ft.add(R.id.contents, mainMenu);
    ft.commit();

    if (savedInstanceState != null) {
        // <restore state>
    }
    else {
        // <initialize stuff>
    }
}

Чтобы исправить это, я пропустил инициализацию фрагмента, когда saveInstanceState не был нулевым, и убедился, что состояние сохранялось правильно в onSaveInstanceState() и восстановлено в onCreate(), и реализовал обычную обработку для onActivityResult().

Ex:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        // <restore state>
    }
    else {
        // <initialize stuff>

        // add main menu -- CORRECT!
        MainMenuFragment mainMenu = new MainMenuFragment();
        FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
        ft.add(R.id.contents, mainMenu);
        ft.commit();
    }
}
2 голосов
/ 22 декабря 2011

Вы правы, это связано с изменением ориентации. Камера работает в ландшафтном режиме в Galaxy Tab.
Таким образом, вы можете добавить android:configChanges="orientation" к вашему тегу <activity> в файле манифеста.

Это решит вашу проблему. onDestroy() и onCreate() не будут вызваны после возвращения с камеры.

...