Android accéléromètre ne fonctionne pas lorsque l'écran est éteint

Je suis du développement d'une application pour mon mémoire de fin d'études en informatique, et j'ai besoin de recueillir et de journal de données d'accélérométrie de l'. J'ai besoin de l'acquérir pour un tout au long de la journée, donc il y a de sérieuses contraintes d'autonomie de batterie (par exemple, je ne peux pas quitter l'écran). Aussi, ce n'est pas un marché cible de l'application, de sorte qu'il est assez acceptable pour faire un peu de sérieux de piratage, même de bas niveau C/C++, si nécessaire.

Il est bien connu que sur beaucoup d'appareils les auditeurs pour des événements d'accéléromètre cesse de générer des événements lorsque l'écran s'éteint (quelques liens concernant ce problème: http://code.google.com/p/android/issues/detail?id=3708 , Accéléromètre cesse de remise des échantillons lorsque l'écran est éteint sur Droid/Nexus One, même avec un WakeLock). J'ai bien cherché des alternatives, certains d'entre eux comprennent des solutions de contournement ne fonctionne pas pour mon périphérique (LG P990, ROM stock).

Donc ce qui se passe ceci:
Lorsque vous vous inscrivez un écouteur d'événement pour android accéléromètre capteur dans un Service, il fonctionne très bien jusqu'à ce que l'écran est éteint. J'ai déjà essayé d'enregistrer l'eventListener sur un Service, sur un IntentService, a essayé d'acquérir des WakeLocks. Concernant les wakelocks, je peux vérifier que le service est encore en cours d'exécution en regardant le LOGcat de sortie, mais il semble que l'accéléromètre est mis en mode veille. L'une des solutions de contournement présentés dans certains des liens est d'annuler l'inscription et ré-enregistrer l'écouteur d'événement à intervalles réguliers en utilisant le fil d'une IntentService comme dans cet extrait de code soufflet

synchronized private static PowerManager.WakeLock getLock(Context context) {
if (lockStatic==null) {
PowerManager mgr=(PowerManager)context.getSystemService(Context.POWER_SERVICE);
lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,NAME);
lockStatic.setReferenceCounted(true);
}
return(lockStatic);
}
@Override
protected void onHandleIntent(Intent intent) {
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.unregisterListener(this);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
synchronized (this) {
boolean run = true;
while (run){
try {
wait(1000);
getLock(AccelerometerService.this).acquire();
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.unregisterListener(this);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
Log.d("Accelerometer service", "tick!");
} catch (Exception e) {
run = false;
Log.d("Accelerometer service", "interrupted; cause: " + e.getMessage());
}
}
}       
}
@Override
public void onSensorChanged(SensorEvent event) {
Log.d("accelerometer event received", "xyz: "+ event.values[0] + "," + event.values[1] + "," +  event.values[2]);
}

ce qui rend en effet la onSensorChange être appelée à chaque fois que nous annuler l'enregistrement/enregistrement de l'écouteur. Le problème est que la réception de l'événement contient toujours les mêmes valeurs, indépendamment de moi, les secousses de l'appareil.

Donc, en gros, mes questions sont les suivantes: ( garder avec moi, je suis presque fini 😛 )

  1. est-il possible d'avoir accès de bas niveau (C/C++ approche) à l'accéléromètre du matériel SANS vous inscrire à un écouteur d'événement?

  2. est-il de toute autre solution de contournement ou de hack?

  3. pourrait n'importe qui avec un plus up-to-date de téléphone de bien vouloir tester si le problème persiste dans le firmware 3.0 et au-dessus?

[Mise à JOUR]

Malheureusement, il semble y avoir un bug avec certains téléphones portables. Plus de détails dans ma réponse.

  • Salut. Je viens de tester le problème avec mon HTC Sensation (ICS). À la fois de l'accéléromètre et le détecteur de champ magnétique gardé rapports avec l'écran éteint. Aussi, avez-vous vérifié la solution de contournement décrite dans le commentaire 46?
  • Merci pour les commentaires Renard. À propos du commentaire de 46, j'ai aussi essayé ça, c'est presque la même approche, comme l'exécution d'un thread qui périodiquement se désinscrit/enregistre un écouteur d'événement.. Mais avec mon appareil je ne reçois que des valeurs fixes pour l'accéléromètre à chaque fois que j'éteins mon écran.. vous remercie Également pour les tests sur ICS... il est bon de savoir qu'il travaille avec elle comme il se doit, malheureusement, il n'y a pas de ICS pour LG P990 encore =/
  • Peut-être serait utile d'essayer de résoudre le problème de l'autre côté, - acquérir de verrouillage de l'écran, mais dans le même temps de réduire la luminosité de l'écran à zéro, afin d'économiser la batterie? Bien sûr, c'est de ne pas fonctionner lorsque vous activez l'écran avec le bouton d'alimentation, mais pour ce cas vous pouvez tenter de réveiller l'appareil pour empêcher l'écran de verrouillage.
  • J'ai récemment fait l'accéléromètre et magnétomètre l'enregistrement sur plusieurs modèles différents androïdes et n'a jamais couru sur ce problème. Mes modèles inclus quelques Cth et un Samsung Captivate, donc je suppose que ce n'était pas qu'une vaste sélection. Mais peut-être que si c'est votre thèse, il vaut la peine au moins de trading temporairement les téléphones avec votre copain pour obtenir vos journaux. Vous pouvez également envisager de courir avec un DIM écran wakelock et la journalisation de moins en moins souvent, de mettre le téléphone en veille pendant 5 minutes à une heure et le réveil régulièrement pour récupérer quelques échantillons. Vous utilisez AlarmManager et BroadcastReciever pour cela.
  • Martin, je pense que vous avez répondu à la question vous-même de sorte que vous devez créer et d'accepter la réponse à votre question et de mettre tous les résultats en elle.
  • Pouvez-vous régulièrement de tourner l'écran sur la requête et de l'accéléromètre? Ou faut-il un flux constant de données? L'interrogation n'est pas l'idéal, mais peut-être le seul compromis entre l'obtention de données sur une période de temps et ne pas tuer la batterie.
  • Est-il une option pour l'utilisation autonome de l'accéléromètre pour cela, comme celles faites par le Miroitement de Recherche qui envoyer les données via bluetooth? Vous pouvez même facilement écrire et flash de votre propre firmware sur ces: shimmer-research.com j'ai travaillé avec moi-même et de travail (et de travail avec Android) --- bien que vous aurez à faire des recherches sur leur vie de la batterie.
  • Je ne peut pas interroger l'accéléromètre de temps en temps, j'ai besoin constamment de la mesurer. Pour l'instant, je vais juste laisser l'écran grisé sur, puis effectuez les tests de batterie avec un autre téléphone portable.
  • J'ai pensé à un accéléromètre mesurant à l'aide de bluetooth, j'ai même Arduino/Bluetooth/Accéléromètre, mais pour un usage quotidien (a terme, cela pourrait un jour devenir un produit) c'est pas pratique. En plus de cela, il serait également consommer plus de puissance, mais là encore, je dois vérifier si elle consomme moins que de laisser l'écran allumé... Donc beaucoup de choses à tester =P mais merci pour l'astuce!

InformationsquelleAutor martin | 2012-04-02