2016-06-25 2 views
1

Je suis confronté à des problèmes de redémarrage de l'accéléromètre dans une application Phonegap. Ce que j'essaie de réaliser, c'est de regarder l'accélération. Après que l'utilisateur a déplacé le smartphone, je veux arrêter l'observateur, faire quelques animations, etc. et après 500ms à 1s, je voudrais recommencer l'observateur.Accéléromètre de redémarrage de Phonegap

Ceci est essentiellement le code pour l'accéléromètre:

watchAcceleration: function() { 
    this.accelerometerID = navigator.accelerometer.watchAcceleration(
    function(acceleration) { 
     console.log("STARTED WATCH"); 

     // Accelerometer calculations going on here ... 

     if(this.direction === correctResponse) { 
      this.restartAcceleration(); 
     } 
     else { 
      alert("FAIL"); 
     } 

     // ... more accelerometer calculations here 
    }.bind(this), 
    function(err) { 
     console.log("error", err) 
    } 
} 

Voici le code de la fonction de redémarrage:

restartAcceleration: function() { 
    if(this.accelerometerID) { 
     navigator.accelerometer.clearWatch(this.accelerometerID); 
     this.accelerometerID = null; 
     console.log("WATCH CLEARED"); 
     setTimeout(function() { 
      this.watchAcceleration(); 
     }.bind(this), 1000); 
    } 
} 

Mon problème est que lorsque l'application démarre l'accéléromètre fonctionne parfaitement. Lorsque l'utilisateur répond correctement, la fonction restartAcceleration est invoquée et l'observateur est effacé. Après les 1000ms dans ce cas, la fonction watchAcceleration est invoquée à nouveau.

Mon téléphone est un Nexus 4. Avez-vous des suggestions sur la façon de redémarrer correctement l'accéléromètre?

Modifier (4e Juillet, 2016): Une question a été déposée ici: https://issues.apache.org/jira/browse/CB-11531

+0

Avez-vous vérifié que 'this' est correct dans le rappel setTimeout? De plus, qu'est-ce que le comportement exact - «STARTED WATCH» n'apparaît-il pas la deuxième fois? – daserge

+0

@daserge - Merci pour votre réponse. Le contexte de 'this' est correct. La chaîne 'STARTED WATCH' n'apparaît pas la deuxième fois. Sortie vers la console au-dessus de la ligne où la fonction 'watchAcceleration' est appelée est imprimée. Il semble donc que le rappel de l'accélération de la montre ne soit plus appelé ... – chrilehner

+0

a-t-il le même problème si vous déployez les tests de plugin de mouvement de périphérique (il y a des tests manuels pour watch/clear)? Le problème se reproduit-il sur un émulateur ou d'autres périphériques? Quelle est la version de votre appareil Android OS? – daserge

Répondre

1

On dirait que ce fut un bug dans le plugin - essayez d'utiliser cette branche PR:

  • git clone -b CB-11531 https://github.com/daserge/cordova-plugin-device-motion
  • cd app
  • cordova plugin rm device-motion
  • cordova plugin add ../cordova-plugin-device-motion
+0

cette branche PR fonctionne comme prévu. Donc, la branche maîtresse du plugin devrait fonctionner soit. Merci d'avoir corrigé ce bug! – chrilehner

+0

Génial, merci d'avoir signalé le problème! – daserge

+0

le bogue existe toujours dans le module NPM. Je connaissais aussi le bug dans la branche master (je pensais qu'il était déjà fusionné). Mais maintenant, je vois que ce n'est pas encore fusionné dans la mise à jour maître – chrilehner