Подтвердить что ты не робот

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Если вы настроите таргетинг за пределы уровня API 13, добавьте

android:configChanges="orientation|keyboardHidden"

в манифесте будет недостаточно.

Отметьте этот фрагмент из документации для Android

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

Поэтому попробуйте добавить

android:configChanges="orientation|keyboardHidden|screenSize"

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

Ответ 2

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

@Override
protected void onDestroy() {

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

    // ...

    super.onDestroy();
}