Impossibilité de changer le taux de l'accéléromètre
-
28-10-2019 - |
Question
Je dois recueillir des données accéléromètre de mon téléphone Android, donc je l'ai fait un petit programme pour le faire.
Après quelques tests, j'ai trouvé que mon taux d'accéléromètre Nexus S est toujours 50 valeurs par seconde lorsque le téléphone est actif, et 6 valeurs par seconde quand il est endormi (avec un PARTIAL_WAKE_LOCK
), quel que soit le taux que je demande (NORMAL
, UI
, GAME
ou FASTEST
).
Je décide donc d'installer une application trouvée sur l'Internet qui teste le taux de l'accéléromètre: http://samoht.fr/tuto/accelerometers-frequency-on-android-with-code
Mais je suis la même « erreur ». Quel que soit le taux que je demande, il est toujours 50 valeurs par seconde lorsque le téléphone est actif
Je ne comprends pas pourquoi mon téléphone se comporte de cette façon. Est-ce un problème:
- en rapport avec le Nexus S?
- spécifique à mon téléphone?
- lié ??à Android 4?
EDIT : Je l'ai testé le programme sur un autre Nexus S (Android 4), et j'ai le même problème. Il semble donc d'éliminer l'une des possibilités énumérées ci-dessus. Il n'est pas liée seulement à mon téléphone
La solution
J'ai effectué des tests sur différents smartphones. Voici les résultats:
Samsung Galaxy Teos
-------------------
* When awake
Normal: 4.17 Hz
UI: 8.43 hz
Game: 16.93 Hz
Fastest: 109.42 Hz
* When asleep
The phone sends null values (0), whatever the mode I chose
Samsung Nexus S
---------------
* When awake
Normal: 49.51 Hz
UI: 49.51 hz
Game: 49.51 Hz
Fastest: 49.51 Hz
* When asleep
6.06 Hz, whatever the mode I chose
LG Nexus 5
----------
* When awake
Normal: 15.39 Hz
UI: 15.4 Hz
Game: 50.05 Hz
Fastest: 196.74 Hz
* When asleep
Normal: 4.96 Hz
UI: 15.41 Hz
Game: 50.12 Hz
Fastest: 198.53 Hz
LG Nexus 4
----------
* When awake
Normal: 15.75 Hz
UI: 15.74 Hz
Game: 48.86 Hz
Fastest: 195.85 Hz
* When asleep
Normal: 5.5 Hz
UI: 15.74 Hz
Game: 49.16 Hz
Fastest: 196.75 Hz
Samsung Galaxy Nexus
--------------------
* When awake
Fastest: 125 Hz
* When asleep
It sends data
Samsung Galaxy Note 2
---------------------
* When awake
Fastest: 100 Hz
* When asleep
The phone does not send anything
Samsung Galaxy S3 and S3 Mini
-----------------------------
* When awake
Fastest: 100 Hz
* When asleep
Fastest: 100 Hz
HTC Wildfire
------------
* When awake
Normal: 4 Hz
UI: 12 hz
Game: 22.2 Hz
Fastest: 38.40 Hz
* When asleep
The phone does not send anything, whatever the mode I chose
HTC Desire
----------
* When awake
Normal: 4.36 Hz
UI: 11.9 hz
Game: 23.3 Hz
Fastest: 47.27 Hz
* When asleep
The phone does not send anything, whatever the mode I chose
Notez que les tests ont été effectués à l'aide d'un verrou de réveil partiel. Sans elle, le Nexus S ne fournit aucune donnée du tout quand il dort.
Il y a aussi une liste utile des smartphones qui accéléromètres envoi (ou non) des données compatibles pendant le sommeil: http://www.saltwebsites.com/2012/android-accelerometers-screen-off
Autres conseils
Ne pas connecter votre téléphone à un PC via USB tout en prenant des données, car les données lors de la collecte est enregistrée dans la carte SD uniquement. Lorsque le téléphone est connecté à un PC via USB sans fichier peut être sauvegardé sur la carte SD.
Alors essayez de déconnecter l'USB tout en collectant les données.
Malheureusement, comme suggéré par d'autres réponses, le retard (ou le taux d'échantillonnage) que vous définissez est seulement une suggestion (pour le système) du minimum requis par votre application toutefois, cela peut changer radicalement en fonction d'autres applications en cours d'exécution ou votre entrée de l'appareil sur les modes d'économie d'énergie (éteindre cpu etc). Une façon je pouvais obtenir un peu bon taux d'échantillonnage était en enregistrant mes données d'un service, ce qui rend le service un service de premier plan et ayant une serrure électrique avec le drapeau PARTIAL_WAKE_LOCK.
Je mets le code dans ce point essentiel https://gist.github.com/julian-ramos/6ee7ad8a74ee4b442530
Ce point essentiel a le code beaucoup plus que vous avez besoin, mais juste faire attention aux deux méthodes suivantes
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// //Power management
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();
.....}
Le code ci-dessus empêche le système d'exploitation pour éteindre le CPU
Maintenant, pour faire de ce service un service de premier plan
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(getApplicationContext())
.setContentTitle("Title")
.setContentText("hola")
.setContentIntent(viewPendingIntent);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
not=notificationBuilder.build();
notificationManager.notify(notificationId,not );
startForeground(notificationId, not);
Le code ci-dessus rend le service une priorité pour le système d'exploitation contrairement à un service normal. Des exemples d'un service de premier plan sont des lecteurs de musique, par exemple.
Avec ce code, j'ai été en mesure d'obtenir le taux d'échantillonnage dont j'ai besoin, même après le virage de la montre est hors de l'écran automatiquement.
vérifier l'application nous avons fréquence fixe échantillonnage à 14-15 indépendamment du modèle d'appareil https://market.android.com/details?id=singh.pal.ajeet&feature=search_result#?t=W251bGwsMSwxLDEsInNpbmdoLnBhbC5hamVldCJd pour tout courrier d'aide-nous à developer.virtuoid@gmail.com