Камера 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
 });