La cámara PhoneGap reinicia la aplicación

Estoy usando la función navigator.camera.getPicture de PhoneGap para recuperar una foto de la cámara del dispositivo en Android.

 function onSuccess(imageData) { alert("Success!"); } function onFail(message) { alert('Failed because: ' + message); } $(function() { $("button").tap(function() { navigator.camera.getPicture(onSuccess, onFail, { quality: 50 }); }); }); 

Cuando hago clic en el botón, se inicia la cámara, pero cuando hago clic en Aceptar en la aplicación de la cámara después de tomar una foto, reinicia la aplicación.

Lo intenté:

  • usa diferentes tipos de fonts.
  • usa diferentes tipos de destino
  • reducir la calidad

¿Algunas ideas?

EDITAR: También comencé un problema en github .

Este problema no es realmente acerca de Phonegap. También es un problema común en las aplicaciones nativas de Android.

Se produce porque cuando se dispara la cámara, la actividad de Android pasa a segundo plano (estado de parada), esperando que la cámara tome la fotografía. Luego, el GC llega y mata la actividad para liberar memoria antes de que termine la acción de la cámara, y cuando la cámara termina, su actividad ya ha muerto. Es por eso que la aplicación se reinicia.

Está en los documentos de Android Lifecycle ( http://developer.android.com/reference/android/app/Activity.html ):

Si una actividad está completamente oscurecida por otra actividad, se detiene. Todavía conserva toda la información de estado y miembros, sin embargo, ya no es visible para el usuario, por lo que su ventana está oculta y el sistema la eliminará a menudo cuando se necesite memoria en otro lugar.

Lo mismo ocurre al acceder a la galería de medios u otros recursos que hacen que su actividad pase a segundo plano. El equipo de Phonegap (ahora Cordova) ya está trabajando para mejorar esto ( https://issues.apache.org/jira/browse/CB-14 ).

Tuvimos este problema en nuestra compañía y la solución fue desarrollar un plugin Phonegap para usar nuestra cámara personalizada, luego nuestra actividad nunca pasa al estado de parada. Siga las instrucciones de la API de Android en http://developer.android.com/guide/topics/media/camera.html#custom-camera y pruébelo también.

¡Nos vemos!


Editar 1:

Presentamos un proyecto de Google Code llamado Plugin de cámara frontal que soluciona el problema de la cámara de Android que reinicia las aplicaciones de Phonegap. Hay alguna orientación sobre cómo usarlo también. Ver: http://code.google.com/p/foreground-camera-plugin/


Editar 2:

Dado que este problema también ocurre con la galería, enviamos otro proyecto de Google Code llamado Complemento de galería de primer plano que funciona con Cordova y soluciona este problema. Por favor, consulte: http://code.google.com/p/foreground-gallery-plugin/

Tenga en cuenta que si prueba estas aplicaciones directamente en su teléfono Android, hay una opción dentro de ” Opciones de desarrollador ” llamada ” No guardar actividades “. Cuando esta opción está marcada, elimina la actividad cuando la abandonas. Específicamente en el caso de la cámara (y otras aplicaciones que se hayan almanecido de su actividad), reiniciará su actividad.

Desmarque esto y vea si eso ayuda.

Tengo un Samsung Galaxy Note II. Yo tuve el mismo problema. Cambié esto en el AndroidManifest.xml y ahora funciona en Samsung y HTC Thunderbolt

    

Los usuarios no querrán reiniciar su teléfono para liberar memoria, o marcar un cuadro en Configuración. La forma fácil de usar que encontré para regresar a la actividad de mi aplicación después de abandonar la cámara, fue agregar la línea:

 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

en CameraLauncher.java del complemento de cámara cordova justo antes de this.cordova.startActivityForResult () intenta devolver el resultado de la cámara. Esto asegura que se recupere la actividad anterior, en lugar de que se recolecte basura y se inicie una nueva instancia. Desde la API de intención de Android:

int FLAG_ACTIVITY_CLEAR_TOP

“Si está establecido, y la actividad que se está iniciando ya se está ejecutando en la tarea actual, entonces, en lugar de lanzar una nueva instancia de esa actividad, todas las demás actividades se cerrarán y esta intención se entregará a (ahora en la parte superior) actividad anterior como un nuevo bash “.

Cuando Android vuelve a lanzar la aplicación después de que se ha tomado la foto, se envía un evento de resume a la aplicación. El evento contiene los datos de fotos tomadas. Entonces, una posible solución implica atrapar el evento:

 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); 

Por supuesto, también debe restaurar el estado de la aplicación. Para eso, guarde la información de su estado, por ej. localStorage antes de abrir la cámara.

Para mí, me ayudó utilizar el plugin de fondo cordova: https://www.npmjs.com/package/cordova-plugin-background-mode

Incluir en config.xml:

  

A continuación, active el evento click para iniciar el complemento de la cámara y enviar la aplicación al fondo:

 $(document).on("click","#btn_bild_aufnehmen",function(){ cordova.plugins.backgroundMode.setDefaults({ text:'desc',title:'appname'}); cordova.plugins.backgroundMode.enable(); //do your camera stuff }); 

No olvide deshabilitar el modo de fondo en caso de éxito con el complemento de la cámara:

 cordova.plugins.backgroundMode.disable(); 

Para estar seguro también deshabilítelo en Reanudar y habilítelo en Pausa:

 function onResume(){ window.plugin.backgroundMode.disable(); } function onPause(){ window.plugin.backgroundMode.enable(); } 

Tengo un problema similar en el que incluso el ejemplo completo proporcionado en Camera Documentation bloquea la aplicación en un dispositivo Android (Samsung, Galaxy S). Aquí hay una salida del registro que obtengo:

enter image description here

También tuve el mismo problema. Borré todos los datos del teléfono para boost el tamaño de la memoria interna del teléfono. Luego detuve todas las aplicaciones en ejecución y reinicié mi aplicación. Esta vez, cuando se llamó al evento de captura, mi aplicación no se bloqueó.

Básicamente, este problema existe para teléfonos con menos memoria interna. Esto funcionará bien en teléfonos de gama superior.

Nota: Agregue también estos parámetros adicionales a la imagen capturada:

  navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 20, destinationType:Camera.DestinationType.DATA_URL, targetWidth: 200, targetHeight: 200, saveToPhotoAlbum : true }); 

Esto realmente está sucediendo cuando el recolector de basura está matando a las actividades de tu dispositivo, cuando algo de tu evento de aplicación es controlado, tu actividad predeterminada va en segundo plano y por lo tanto se está matando.

Para solucionar esto, debe ir a Opciones de desarrollador. Allí verá la opción No guardar actividades , simplemente desmarque eso. reinicia tu aplicación y prueba cámara ahora. funcionará sin problemas.