web-dev-qa-db-fra.com

La caméra PhoneGap redémarre l'application

J'utilise la fonction navigator.camera.getPicture de PhoneGap pour récupérer une photo de l'appareil photo de l'appareil sous Android.

function onSuccess(imageData) {
    alert("Success!");
}

function onFail(message) {
    alert('Failed because: ' + message);
}

$(function() {
    $("button").tap(function() {
        navigator.camera.getPicture(onSuccess, onFail, { quality: 50 }); 
    });
});

Lorsque je clique sur le bouton, il fait démarre l'appareil photo, mais lorsque je clique sur OK dans l'application Appareil photo après avoir pris une photo, l'application redémarre.

J'ai essayé de:

  • utilisez différents types de sources.
  • utilisez différents types de destination.
  • réduire la qualité.

Des idées?

EDIT: J'ai aussi commencé un problème sur github .

32
Alon Gubkin

Ce problème ne concerne pas réellement Phonegap. C'est également un problème courant sur les applications Android natives.

Cela se produit car, lorsque la caméra est déclenchée, l'activité Android passe en arrière-plan (état onStop) et attend que la caméra prenne la photo. Ensuite, le GC arrive et supprime l'activité pour libérer de la mémoire avant la fin de l'action de la caméra. Lorsque cette dernière est terminée, votre activité est déjà terminée. C'est pourquoi l'application est redémarrée.

C'est sur Android Lifecycle docs ( http://developer.Android.com/reference/Android/app/Activity.html ):

Si une activité est complètement masquée par une autre activité, elle est arrêtée. Il conserve toujours toutes les informations sur les états et les membres. Cependant, il n'est plus visible par l'utilisateur. Sa fenêtre est donc masquée et il est souvent tué par le système lorsque la mémoire est nécessaire ailleurs.

La même chose se produit en accédant à la médiathèque ou à d'autres ressources qui font que votre activité passe en arrière-plan. L'équipe Phonegap (maintenant Cordova) travaille déjà à l'amélioration de ce problème ( https://issues.Apache.org/jira/browse/CB-14 ).

Nous avions ce problème dans notre entreprise et la solution consistait à développer de manière native un plug-in Phonegap pour utiliser notre caméra personnalisée. Notre activité ne passera jamais à l'état onStop. Suivez les instructions de l'API Android sur http://developer.Android.com/guide/topics/media/camera.html#custom-camera et essayez-le également.

À plus!


Éditer 1:

Nous avons soumis un projet Google Code nommé Foreground Camera Plugin qui résout le problème posé par le redémarrage d'Android Camera par les applications Phonegap. Il y a aussi une orientation sur la façon de l'utiliser. Veuillez consulter: http://code.google.com/p/foreground-camera-plugin/


Éditer 2:

Étant donné que ce problème se produit également avec la galerie, nous avons soumis un autre projet de code Google appelé Plugin de galerie d'arrière-plan qui fonctionne avec Cordova et corrige ce problème. Veuillez consulter: http://code.google.com/p/foreground-gallery-plugin/

35

Notez que si vous testez ces applications directement sur votre téléphone Android, une option se trouve dans " Options pour les développeurs " appelée " Ne pas conserver les activités ". Lorsque cette option est cochée, l’activité disparaît lorsque vous la quittez. Plus précisément, dans le cas de la caméra (et d’autres applications issues de votre activité), elle redémarrera votre activité. 

Décochez cette case et voyez si cela aide.

27
Manyfatboy

J'ai un Samsung Galaxy Note II. J'ai eu le même problème. J'ai changé cela dans le fichier AndroidManifest.xml et cela fonctionne maintenant sur Samsung et 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
user372225

Les utilisateurs ne veulent pas redémarrer leur téléphone pour libérer de la mémoire ou cocher une case dans Paramètres. La méthode conviviale que j'ai trouvée pour revenir à l'activité de mon application après avoir quitté l'appareil photo a été d'ajouter la ligne suivante:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

dans CameraLauncher.Java du plug-in cordova de la caméra juste avant this.cordova.startActivityForResult () tente de renvoyer le résultat de la caméra. Cela permet de s'assurer que l'ancienne activité est récupérée plutôt que d'être collectée et de lancer une nouvelle instance. Depuis l'API Android Intent: 

int FLAG_ACTIVITY_CLEAR_TOP

"Si cette option est définie et que l'activité en cours d'exécution est déjà en cours d'exécution dans la tâche actuelle. et cette intention sera transmise à l'ancienne activité (désormais la plus importante) en tant que nouvelle intention. "

2
kwills

Lorsque Android relance l'application après la prise de vue, un événement resume est envoyé à l'application. L'événement contient les données de photo prises. Une solution de contournement possible consiste donc à capturer l'événement:

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

Bien entendu, vous devez également restaurer l'état de l'application. Pour cela, enregistrez vos informations d'état sur, par exemple. localStorage avant d’ouvrir la caméra.

2
tuomassalo

Pour moi, il m'a été utile d'utiliser le plugin Cordova Background: https://www.npmjs.com/package/cordova-plugin-background-mode

Inclure dans config.xml:

<gap:plugin name="cordova-plugin-background-mode" source="npm"/>

Ensuite, déclenchez l'événement click pour démarrer le plugin caméra et envoyer l'application en arrière-plan:

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

N'oubliez pas de désactiver le mode fond en cas de succès avec le plugin camera: 

cordova.plugins.backgroundMode.disable();

Pour être sûr, désactivez également onResume et activez-le en pause:

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

Cela se produit réellement lorsque les activités de votre appareil sont supprimées par le récupérateur de place, lorsque certains événements de votre application sont traités, votre activité par défaut passe en arrière-plan et est donc supprimée. 

Pour résoudre ce problème, vous devez aller dans Options pour les développeurs Vous verrez alors l’option Ne pas garder les activités , décochez cette case. redémarrez votre application et essayez l'appareil photo maintenant. cela fonctionnera sans problème.

0
Anshul Jain

J'ai un problème similaire où même l'exemple complet fourni dans Documentation de l'appareil photo bloque l'application sur un périphérique Android (Samsung, Galaxy S). Voici une sortie du journal que je reçois:

enter image description here

0
Zorayr

J'ai aussi eu le même problème. J'ai effacé toutes les données du téléphone pour augmenter la taille de la mémoire interne du téléphone. Puis arrêté toutes les applications en cours d'exécution et redémarré mon application. Cette fois, lorsque l'événement de capture a été appelé, mon application ne s'est pas bloquée. 

Fondamentalement, ce problème existe pour les téléphones avec moins de mémoire interne. Cela fonctionnera très bien sur les téléphones haut de gamme.

Remarque: Ajoutez également ces paramètres supplémentaires à l'image capturée:

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