Galaxy S3 - фотографирование в портретном режиме разрушает активность

Итак, этот вопрос задавали в разных формах на этом форуме, но ни один из ответов мне не помогает. У меня есть ошибка, которую я смог воспроизвести только на Samsung Galaxy S3.

Я хочу просто сделать и сохранить фотографию с помощью камеры телефона, но моя активность уничтожается до того, как я когда-либо получу ответ от onActivityResult. Это происходит ТОЛЬКО, когда я использую камеру в портретном режиме, в ландшафтном режиме все нормально.

Я использую этот код для запуска камеры:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, Config.ACTIVITY_TAKE_PHOTO);

В портретном режиме я никогда не вижу вызова onActivityResult (из активности камеры), я просто вижу onDestroy (), вызываемый в моем действии запуска. В журнале нет исключений или ошибок, и нет ничего явно плохого в его сбое.

Я видел сообщения, в которых рекомендуется добавлять "android: configChanges =" Ориентация | keyboardHidden "" в манифест и делать много других вещей для управления изменением ориентации, которое происходит при использовании камеры, но пока ничего не помогло.

Кто-нибудь еще решил эту проблему?


person TomBomb    schedule 22.04.2013    source источник
comment
Саймон, у вас есть какой-нибудь совет, как получить дополнительную информацию о onDestroy () моей деятельности? Могу ли я что-нибудь сделать, чтобы распечатать более подробную трассировку стека, ведущую к нему?   -  person TomBomb    schedule 22.04.2013
comment
Так что, похоже, я должен перестать беспокоиться о предотвращении изменения ориентации экрана и, как следствие, разрушения активности, и больше сосредоточиться на изящном восстановлении из onDestroy после каждого захвата изображения?   -  person TomBomb    schedule 23.04.2013
comment
Однако я вижу ту же проблему на нескольких моделях S3. Один работает нормально, а другой onActivityResult никогда не вызывается. Черт!!!   -  person Kumar Bibek    schedule 02.05.2013
comment
@TomBomb вы должны вставить сообщение об ошибке logcat   -  person dharam    schedule 14.10.2013
comment
вы можете проверить noHistory=true или `Intent.FLAG_ACTIVITY_NO_HISTORY. Подробнее см. Здесь: stackoverflow.com/a/62107555/3763032   -  person mochadwi    schedule 30.05.2020


Ответы (2)


Если вы нацеливаетесь на уровень выше 13 API, добавление

android:configChanges="orientation|keyboardHidden"

на Манифест будет мало.

Ознакомьтесь с этим отрывком из документации Android.

Примечание. Если ваше приложение нацелено на уровень API 13 или выше (как объявлено атрибутами minSdkVersion и targetSdkVersion), вам также следует объявить конфигурацию screenSize, поскольку она также изменяется при переключении устройства между книжной и альбомной ориентацией.

Следовательно, попробуйте добавить

android:configChanges="orientation|keyboardHidden|screenSize"

в ваш файл манифеста. Это должно решить вашу проблему.

person dishan    schedule 14.10.2013
comment
Это было очень полезно для меня - person adrian4aes; 01.04.2014
comment
@dishan Я понимаю ориентацию и флаг screenSize здесь, но почему именно keyboardHidden? - person Tash Pemhiwa; 20.04.2014
comment
@TashPemhiwa Да, именно на этот вопрос keyboardHidden может не повлиять. Таким образом android:configChanges="orientation|screenSize" также должен работать. Но опять же включение keyboardHidden обеспечит вам дополнительную защиту, потому что это также предотвращает перезапуск вашей активности при изменении доступности клавиатуры. orientation и keyboardHidden - это наиболее часто используемые изменения конфигурации в Android, которые люди хотят обрабатывать самостоятельно, не перезапуская активность. Так что, имея keyboardHidden, будет мудрый поступок. - person dishan; 07.05.2014

Android может вызывать метод destroy () в определенных сценариях. Один из них - когда мы используем метод finish (). Альтернативой является использование метода isFinishing () из класса Activity. Если он действительно дорабатывается, можно доработать свои ресурсы, в противном случае вы можете сохранить значения, выделенные классу, наследующему Application

@Override
protected void onDestroy() {

    final YourApp app = (YourApp) getApplicationContext();
    if (app != null && isFinishing()) {
        app.finalizeAppResources();
    }

    // ...

    super.onDestroy();
}
person Douglas Frari    schedule 12.09.2013