Domanda

Devo raccogliere i dati dell'accelerometro dal mio telefono Android, quindi ho fatto un piccolo programma per farlo.

Dopo alcuni test, ho scoperto che la tariffa del mio accelerometro Nexus è sempre 50 valori al secondo quando il telefono è attivo e 6 valori al secondo quando dorme (con a PARTIAL_WAKE_LOCK), qualunque sia il tasso che chiedo (NORMAL, UI, GAME o FASTEST).

Così ho deciso di installare un'applicazione trovata su Internet che verifica la velocità dell'accelerometro: http://samoht.fr/tuto/ackcelerometers-frequency-on-android-with-code

Ma ho ricevuto lo stesso "errore": qualunque sia la velocità che chiedo, sono sempre 50 valori al secondo quando il telefono è attivo.

Non capisco perché il mio telefono si comporta in questo modo. È un problema :

  • relativo al Nexus S?
  • specifico per il mio telefono?
  • relativo ad Android 4?

MODIFICARE : Ho testato il programma su un altro Nexus S (Android 4) e ho lo stesso problema. Quindi sembra eliminare una delle possibilità sopra elencate: non è correlata solo al mio telefono.

È stato utile?

Soluzione

Ho eseguito alcuni test su diversi smartphone. Ecco i risultati:

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

Si noti che i test sono stati eseguiti utilizzando un blocco Wake parziale. Senza di essa, il Nexus S non fornisce dati quando dorme.

Esiste anche un utile elenco di smartphone che gli accelerometri inviano (o meno) dati compatibili quando dormono: http://www.saltwebsites.com/2012/android-accielerometers-screen-off

Altri suggerimenti

Non collegare il telefono a un PC tramite USB durante l'assunzione di dati perché durante i dati di raccolta vengono registrati solo nella scheda SD. Quando il telefono è collegato al PC tramite USB, nessun file può essere salvato nella scheda SD.

Quindi prova a disconnettere l'USB durante la raccolta dei dati.

Sfortunatamente, come suggerito da altre risposte, il ritardo (o la velocità di campionamento) che si imposta è solo un suggerimento (per il sistema) del minimo richiesto dall'applicazione, tuttavia, questo può cambiare drasticamente a seconda delle altre applicazioni in esecuzione o dell'immissione del dispositivo sul risparmio energetico Modalità (spegnimento della CPU ecc.). Un modo in cui sono stato in grado di ottenere una tariffa di campionamento un po 'buona è stato registrando i miei dati da un servizio, rendendo il servizio un servizio in primo piano e avendo un blocco di alimentazione con la bandiera parziale_wake_lock.

Ho messo il codice in questo GISThttps://gist.github.com/julian-ramos/6ee7ad8a74ee4b442530

Quella gist ha molto più codice di quello che hai bisogno, ma presta attenzione ai prossimi due metodi

@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();
.....}

Il codice sopra impedisce al sistema operativo di disattivare la CPU

Ora per rendere questo servizio un servizio in primo piano

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);

Il codice di cui sopra rende il servizio una priorità per il sistema operativo a differenza di un normale servizio. Esempi di un servizio in primo piano sono i lettori musicali per esempio.

Con questo codice sono stato in grado di ottenere la frequenza di campionamento di cui ho bisogno anche dopo che l'orologio è uscito automaticamente dallo schermo.

Controlla questa app abbiamo una frequenza di campionamento fissa a 14-15 indipendentemente dal modello di dispositivo https://market.android.com/details?id=singh.pal.ajeet&feature=search_result#?t=w251bgwsmswxldesinnpbmdolnbc5hamvldcjdPer qualsiasi assistenza, inviaci a sviluppatore.virtuid@gmail.com

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top