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 "к манифесту и делать много других вещей для управления изменением ориентации, которое происходит при использовании камеры, но пока ничего не помогло.
Кто-нибудь еще решил эту проблему?
Ответы
Ответ 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();
}