Камера PhoneGap перезапускает приложение
Я использую функцию PhoneGap navigator.camera.getPicture
для извлечения фотографии с камеры устройства на Android.
function onSuccess(imageData) {
alert("Success!");
}
function onFail(message) {
alert('Failed because: ' + message);
}
$(function() {
$("button").tap(function() {
navigator.camera.getPicture(onSuccess, onFail, { quality: 50 });
});
});
Когда я нажимаю кнопку, она запускает камеру, но когда я нажимаю OK в приложении камеры после фотографирования, она перезапускает приложение.
Я попытался:
- используйте разные типы источников.
- используйте разные типы назначения.
- снизить качество.
Любые идеи?
EDIT: я также начал проблему в github.
Ответы
Ответ 1
Эта проблема не связана с Phonegap. Это обычная проблема для родных приложений для Android.
Это происходит потому, что при срабатывании камеры активность андроида переходит в фоновое (состояние onStop), ожидая, пока камера сделает снимок. Затем GC приходит и убивает активность, чтобы освободить память до завершения действия камеры, и когда камера сделана, ваша деятельность уже умерла. Вот почему приложение перезагружается.
Это на документах Lifecycle для Android (http://developer.android.com/reference/android/app/Activity.html):
Если действие полностью закрыто другой деятельностью, оно прекращается. Он по-прежнему сохраняет всю информацию о состоянии и членах, однако он больше не виден пользователю, поэтому его окно скрыто, и оно часто будет убито системой, когда требуется память в другом месте.
То же самое происходит при использовании медиа-галереи или других ресурсов, которые заставляют вашу деятельность заходить в фоновый режим. Команда Phonegap (теперь Cordova) уже работает над улучшением (https://issues.apache.org/jira/browse/CB-14).
У нас была эта проблема в нашей компании, и решение заключалось в том, чтобы разработать плагин Phonegap для использования нашей индивидуальной камеры, а затем наша деятельность никогда не переходит в состояние onStop. Следуйте инструкциям API Android на http://developer.android.com/guide/topics/media/camera.html#custom-camera и попробуйте также.
См. ya!
Изменить 1:
Мы отправили проект Google Code с именем Плагин для переднего плана камеры, который устраняет проблему перезагрузки Android-камер Android. Существует определенная ориентация на то, как его использовать. Смотрите: http://code.google.com/p/foreground-camera-plugin/
Изменить 2:
Так как эта проблема возникает и в галерее, мы отправили другой проект Google Code с именем Плагин для фоновой графики, который работает с Cordova и исправляет эту проблему. Пожалуйста, смотрите: http://code.google.com/p/foreground-gallery-plugin/
Ответ 2
Обратите внимание, что если вы тестируете эти приложения прямо на вашем телефоне Android, там опция " Параметры разработчика" называется " Не выполнять действия". Когда этот параметр отмечен, он отменяет действие, когда вы его покидаете. В частности, в случае камеры (и других приложений, запущенных из вашей активности), она перезапустит вашу деятельность.
Снимите этот флажок и посмотрите, поможет ли это.
Ответ 3
У меня есть Samsung Galaxy Note II. У меня такая же проблема. Я изменил это в AndroidManifest.xml, и теперь он работает на Samsung и HTC Thunderbolt.
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="10"/>
<activity android:configChanges="orientation|keyboardHidden" />
Ответ 4
Пользователи не захотят перезагрузить свой телефон, чтобы освободить память, или установите флажок в настройках. Другим способом, который я нашел, чтобы вернуться к активности моего приложения после выхода из камеры, было добавление строки:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
в CameraLauncher.java плагина камеры cordova прямо перед this.cordova.startActivityForResult() пытается передать результат камеры. Это гарантирует получение старой активности, а не сборку мусора и запуск нового экземпляра. Из API андроида Intent:
int FLAG_ACTIVITY_CLEAR_TOP
"Если установлено, и запущенная деятельность уже запущена в текущей задачи, то вместо запуска нового экземпляра этого деятельность, все другие мероприятия поверх нее будут закрыты и это намерение будет передано (сейчас сверху) старой деятельности как новое намерение".
Ответ 5
Когда Android повторно запускает приложение после того, как изображение было снято, событие resume
отправляется в приложение. Событие содержит принятые фотоданные. Таким образом, возможное обходное решение предполагает захват события:
document.addEventListener('resume', function(evt) {
if(evt.action === 'resume' && evt.pendingResult) {
var r = evt.pendingResult;
if(r.pluginServiceName === 'Camera' && r.pluginStatus === 'OK') {
// r.result contains file:/// url or a base64 image.
}
}
}, false);
Конечно, вам также необходимо восстановить состояние приложения. Для этого сохраните информацию о состоянии, например. localStorage перед открытием камеры.
Ответ 6
Это фактически происходит, когда ваши действия с устройством уничтожаются сборщиком мусора, когда какое-то из ваших событий приложения тригерируется, ваша деятельность по умолчанию идет по фону, и поэтому она убивается.
Чтобы исправить это, вам нужно перейти в Параметры разработчика. Там вы увидите опцию Не выполнять действия, просто снимите этот флажок. перезагрузите приложение и попробуйте камеру сейчас. он будет работать плавно.
Ответ 7
Для меня это помогло использовать плагин фонового плагина: https://www.npmjs.com/package/cordova-plugin-background-mode
Включить в config.xml:
<gap:plugin name="cordova-plugin-background-mode" source="npm"/>
Затем запускайте событие click для запуска плагина камеры и отправки приложения в фоновый режим:
$(document).on("click","#btn_bild_aufnehmen",function(){
cordova.plugins.backgroundMode.setDefaults({ text:'desc',title:'appname'});
cordova.plugins.backgroundMode.enable();
//do your camera stuff
});
Не забудьте отключить фоновый режим в случае успеха с помощью плагина камеры:
cordova.plugins.backgroundMode.disable();
Кроме того, отключите его onResume и включите его onPause:
function onResume(){
window.plugin.backgroundMode.disable();
}
function onPause(){
window.plugin.backgroundMode.enable();
}
Ответ 8
У меня есть аналогичная проблема, когда даже полный пример, представленный в Документация к камерам, сбой приложения на Android-устройстве (Samsung, Galaxy S). Вот вывод журнала, который я получаю:
![enter image description here]()
Ответ 9
У меня также была та же проблема. Я удалил все данные с телефона, чтобы увеличить объем внутренней памяти телефона. Затем остановили все запущенные приложения и перезапустили мое приложение. На этот раз, когда событие захвата было вызвано, мое приложение не сработало.
В основном эта проблема существует для телефонов с меньшей внутренней памятью. Это будет отлично работать в телефонах более высокого класса.
Примечание: Также добавьте эти дополнительные параметры в захваченное изображение:
navigator.camera.getPicture(onPhotoDataSuccess, onFail, {
quality: 20,
destinationType:Camera.DestinationType.DATA_URL,
targetWidth: 200,
targetHeight: 200,
saveToPhotoAlbum : true
});