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 :P )
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 un autre solution de contournement ou de hack?
quelqu'un pourrait-il 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 ci-dessus?
[Mise à JOUR]
Malheureusement, il semble y avoir un bug avec certains téléphones portables. Plus de détails dans ma réponse.