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 😛 )
-
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?
-
est-il de toute autre solution de contournement ou de hack?
-
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!
Vous devez vous connecter pour publier un commentaire.
En gros, c'est un problème avec mon téléphone. D'autres utilisateurs ont signalé cela arrive aussi avec leurs téléphones, de marques différentes, mais même version d'Android. Autres personnes n'ont aucun problème à tous - fortement en indiquant que ce n'est pas un problème avec la version stock d'android, mais à partir de la mise en œuvre de chaque entreprise pour leur pilotes de matériel.
J'ai besoin constant de données d'accélérométrie de l'livré et ne peuvent pas avoir un dongle mesurer ces données pour moi - j'ai un Arduino Bluetooth et d'un accéléromètre, si je pouvais avoir mis en œuvre cette solution. J'ai donc décidé que la solution temporaire pour mon téléphone portable a été de laisser l'écran allumé (en grisé) et d'ignorer la consommation de la batterie. Plus tard, je vais faire les tests pour l'utilisation de la batterie à l'aide d'un autre téléphone android qui fonctionne avec l'écran éteint.
Plus d'informations sur le bug
J'ai fait des recherches et trouvé des rapports provenant d'autres utilisateurs d'Android et je pense que peut-être je comprends ce qui se passe. La bibliothèque libsensors.alors, qui a les pilotes pour les capteurs téléphone n'est pas développé par Google, mais par chaque téléphone cellulaire fournisseur de cours, parce que chaque téléphone portable possède son propre matériel spécifique. Google fournit uniquement un fichier en-tête C afin que les développeurs savent ce qu'ils ont à mettre en œuvre. Dans certaines implémentations de ces pilotes, les développeurs il suffit de tourner l'accéléromètre éteint lorsque l'écran s'éteint, l'empêchant ainsi le capteur de l'écouteur d'événement pour recevoir de nouveaux événements.
J'ai aussi testé avec CyanogenMod RC7.2 mais il ne fonctionne pas non plus, parce que l'accéléromètre sont les pilotes d'origine de LG.
E-mails échangés avec le service RH de LG
J'ai envoyé un e-mail aux développeurs du LG P990 et a finalement obtenu des réponses concrètes! Cela peut être d'une grande aide pour certaines personnes comme moi qui sont confrontés à ces questions avec Android. J'ai écrit à la question suivante
Ce que j'ai reçu cette réponse:
J'ai ensuite envoyé un e-mail de retour, en disant entre autres choses, que j'ai considéré ce un bug, puisque l'on devrait avoir accès à tout le matériel lors de l'acquisition d'un signal de verrouillage:
Et puis j'ai reçu cette réponse:
Donc, apparemment, ils savent à ce sujet, mais ne sont pas en essayant de corriger ce soit parce qu'ils ne pense pas que c'est un bug que je crois fermement est une logique de faille - ou qu'ils n'ont pas le temps et les ressources nécessaires pour les corriger.
Ligne de fond
Si vous avez un téléphone cellulaire qui n'envoie pas d'accéléromètre événements avec l'écran éteint, essayez de mettre à jour votre firmware. Si cela ne résout pas et que vous voulez vraiment faire quelque grave piratage, re mettre en œuvre votre matériel de couche - indice: c'est probablement quelque chose à voir avec libsensors.donc.
Je ne sais pas si ce sera effectivement vous aider, mais j'ai trouvé un travail autour (Pas sûr de savoir comment bien s'aidera de l'économie de la batterie si).
À l'aide de bash, j'ai une boucle while chat-ing
/sys/devices/virtual/accelerometer/accelerometer/acc_file
, et lorsque je désactive l'écran via le bouton d'alimentation de la sortie continue, mais est gelé. (J'ai eu sshd cours d'exécution dans un chroot de là, l'être capable de le voir.)Cependant, en écho à
0 > /sys/devices/platform/msm_fb.196609/leds/lcd-backlight/brightness
. L'écran s'éteint, et la sortie est continue.C'est sur un SGH-T589W, la version android 2.3.6.
J'ai appliqué la PARTIAL_WAKE_LOCK et cela a fonctionné comme un charme pour moi. Testé sur OS 5.0, 6.0 et 7.0. Voici mon code pour acquérir et libérer sillage de verrouillage. Attention, il a augmenté la batterie de drainage, afin d'obtenir et de libérer intelligemment.
Ref: https://developer.android.com/training/scheduling/wakelock.html#cpu
Je suis en train de travailler sur une prédiction sdk, qui utilisent un dispositif de capteurs (accéléromètre/gyroscope) de données et prédit les événements de l'utilisateur. J'ai connu le même problème.
J'ai couru dans des problèmes similaires avec le Samsung Nexus exécutant Android 4.0.2 à l'aide d'autres services du système stop/pause pendant que l'écran est désactivé, même si un
PARTIAL_WAKE_LOCK
est acquis. Ma solution a été d'utiliser unSCREEN_DIM_WAKE_LOCK
comme dans:Il serait de loin préférable d'avoir l'écran entièrement éteint, mais au moins, cette solution fonctionne mais il serait encore mieux si je pouvais limiter à l'aide d'un
SCREEN_DIM_WAKE_LOCK
uniquement aux dispositifs/Systèmes d'exploitation qui en ont besoin.J'ai hate de vous décevoir, mais certains appareils, il suffit de ne pas garder acceleromet pendant qu'ils sont dans un mode de sommeil. Certains le font, d'autres pas. Vous pouvez consulter toutes les podomètre de perte de poids de l'app sur le magasin de la plupart d'entre eux affirment explicitement que cela ne peut pas fonctionner sur certains appareils.
Si l'partielle wake lock option n'est pas disponible pour votre téléphone, cela signifie que le pilote pour le capteur a
early_suspend
activé.Il y a deux options.
1: Désactiver
EARLY_SUSPEND
dans le pilote2: Ajouter un temps de fonctionnement du pavillon qui peut
enable
/disable early_suspend
fonctionnalité au niveau du pilote.ex. cat /sys/module/earlysuspend/capteur de 1/0
De l'OMI, la deuxième option doit avoir été là depuis le début.