J'apprends les bases de la programmation Android.
J'ai une simple application de test Android dans laquelle je connecte l'accéléromètre, le magnétomètre et les données d'orientation vers un fichier externe tout en l'affichant. J'entraîne le processus de journalisation en cliquant sur le bouton qui ressemble quelque chose de similaire à celui-ci ... p> Il y a aussi un bouton d'arrêt, qui doit arrêter le processus de journalisation (et enfin désenregistrer en appelant Unregisterlistener pour chaque capteur) P> Le processus de récupération de données se produit à l'intérieur du gestionnaire Onsensorchanged strong> EventHandler regarde quelque chose comme ça ... p> Bien que je reçois les données de tous les capteurs configurés, je Ne pas avoir le contrôle sur la vitesse à laquelle les données sont reçues. i.e p> Je sais que l'événement Sensorchanged est tiré comme et lorsque les données du capteur sont modifiées. Cependant, je veux que cet événement soit tiré à un taux fixe. question: strong> p> experts ici en SO.Veuillez m'aider :) p> p>
5 Réponses :
Vous pouvez modifier l'intervalle en modifiant le délai lors de votre inscription au capteur.
int SENSOR_DELAY_FASTEST get sensor data as fast as possible int SENSOR_DELAY_GAME rate suitable for games int SENSOR_DELAY_NORMAL rate (default) suitable for screen orientation changes int SENSOR_DELAY_UI rate suitable for the user interface
Je cherche un moyen explicite de demander des données de capteur et non la configuration de la vitesse à laquelle les données du capteur sont rendues à l'utilisateur.
Lors de l'enregistrement de votre auditeur avec le Évaluez les événements du capteur de taux sont livrés à. Ceci n'est qu'une allusion à
le système. Les événements peuvent être reçus plus rapidement ou plus lents que le
taux. Généralement des événements sont reçus plus rapidement. La valeur doit être l'une des
Sensor_delay_normal, sensor_delay_ui, sensor_delay_game, ou
Sensor_delay_fastest ou, le délai souhaité entre les événements dans
microseconde. p>
blockQuote>
Alors, passe simplement sensormanager code> en utilisant InscriptionLISNER , au lieu des constantes fixes
sensor_delay _... code> Vous pouvez Passez l'intervalle en microsecondes forts> comme décrit dans les Javadocs: P>
Puisque vous savez que s'il n'y avait pas SensorChanged événement déclenché, il n'y avait pas de changement, vous pouvez simplement utiliser votre ancienne valeur. Comme vous avez demandé des données à des intervalles spécifiques LOG, je ne voudrais pas faire une sortie dans la méthode onSensorChanged seulement clone les nouvelles données à votre variable accelerometerdata. Et que la valeur de log accelerometerdata tous les 40ms. De cette façon, vous connectez la valeur réelle tous les 40ms même si les données na pas le changement .... p>
Note: Selon Ridcullys, il semble aussi Réponse être possible d'obtenir des données du capteur « livré » à des intervalles de temps de spécifiques. Mais comme il y a un retard sur ces « livraisons », comme toujours avec capteur de données sur Android, avec ma solution, vous serez plus exactement sur l'intervalle 40ms. D'autre part, il pourrait arriver que si les changements de données du capteur dans le moment que vous vous connectez, il peut arriver que vous retardez les nouvelles données pour un intervalle. Et je suppose (pas sûr de ce point) - depuis son à peu près l'exploitation forestière et pas qqch comme « obtenir aussi vite que possible en temps réel », donc ce n'est pas une exigence -. Les causes Timer Solution moins de charge CPU < / p>
Oui, l'exigence n'est pas de disposer des données du capteur en temps réel et de disposer des données disponibles (pour interrogation) à un taux égal.
J'ai essayé cette solution mais cela n'a pas fonctionné pour moi: \ Les nouveaux threads ont été créés qui enregistre de mauvaises données à des intervalles incorrects. Quelqu'un voudrait-il poster une extrait de code pour cette solution? Merci dans les deux sens :)
J'ai essayé de comprendre comment puis-je avoir de très longs retards avec des capteurs, et jusqu'à présent, j'ai réussi. La documentation sur le développeur.Android parle que le délai peut être spécifié dans les microsecondes, ci-dessous est un grand nombre que j'ai essayé: Cependant, notez le vidage de LogCat ci-dessous - l'Onsensorchanged () - Gets Appelé autant que 4 fois une seconde ... J'essaie de trouver des retards plus importants sans succès jusqu'à présent !!! P> 01-14 06: 58: 07.088: Capteurs D / IOE (20933 ): Onsensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70
01-14 06: 58: 07.268: Capteurs D / IOE (20933): Onsensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70
01-14 06: 58: 07.448: Capteurs D / IOE (20933): Onsensensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70
01-14 06: 58: 07.628: Capteurs D / IOE (20933): Onsensensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70
01-14 06: 58: 07.808: Capteurs D / IOE (20933): Onsensensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70
01-14 06: 58: 07.989: Capteurs D / IOE (20933): Onsensensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70
01-14 06: 58: 08.169: Capteurs D / IOE (20933): Onsensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70 p> p>
Il semble que le taux à laquelle onsensorchanged est appelé doit être l'une des 4 valeurs suggérées.
Ce que vous pouvez faire pour "lectures lentes" est utiliser sensor_delay_ui et (dans Onsensorchanged) mesurent le temps qui s'est passé depuis La dernière fois que vous avez lu la sensordata: p> Le seul inconvénient que je vois ici est que la déclaration IF sera appelée plusieurs fois avec un faux résultat. P> p>
Puisque vous souhaitez enregistrer les données de vos intervalles spécifiques, pourquoi enflammer l'événement Sensorchanged? Pourquoi ne pas utiliser une sorte de minuterie et demander les valeurs réelles après l'heure spécifiée? Ou suis-je quelque chose de mal ici?
@nurgan: L'événement sensorchanged est tiré comme et lorsqu'il y a une modification des données du capteur. Je n'ai aucun contrôle sur cet événement. En ce qui concerne votre suggestion de lire / demander les valeurs réelles à une heure spécifiée .... est exactement ce que je demande. Comment demander explicitement les données du capteur ??
Eh bien, selon Nininho écrivit, cela ne semble pas être possible à Android. Mais puisque vous savez que s'il n'y avait pas d'événement Sensorchanged tiré, il n'y avait pas de changement, vous pouvez simplement utiliser votre vieille valeur. Étant donné que vous avez demandé des données de journal dans des intervalles spécifiques, je ne ferais aucune sortie dans la méthode Onsensorchanged, il suffit de cloner les nouvelles données à votre variable accéléromètreData. Et que de loger la valeur d'accéléromètre data tous les 40 ms. De cette façon, vous enregistrez la valeur réelle toutes les 40 ms même si les données ne changent pas ....
@nurgan: Enfait c'est ce que j'ai fait hier. On dirait que nous sommes tous les deux dans les mêmes lignes :) Pouvez-vous poster cela comme une réponse afin que je puisse l'accepter.