Pregunta

Tengo que recopilar datos de acelerómetro de mi teléfono Android, por lo que he hecho un pequeño programa para hacerlo.

Después de algunas pruebas, descubrí que la tasa de mi acelerómetro de Nexus es siempre 50 valores por segundo cuando el teléfono está activo y 6 valores por segundo cuando está dormido (con un PARTIAL_WAKE_LOCK), sea cual sea la tarifa que pido (NORMAL, UI, GAME o FASTEST).

Así que decidí instalar una aplicación encontrada en Internet que prueba la tasa del acelerómetro: http://samoht.fr/tuto/accelerometers-frequency-on-android-with-code

Pero obtuve el mismo "error": sea cual sea la velocidad que pido, siempre son 50 valores por segundo cuando el teléfono está activo.

No entiendo por qué mi teléfono se comporta de esta manera. Es un problema :

  • relacionado con el nexus s?
  • específico de mi teléfono?
  • relacionado con Android 4?

EDITAR : He probado el programa en otro Nexus S (Android 4), y tengo el mismo problema. Por lo tanto, parece eliminar una de las posibilidades enumeradas anteriormente: no está relacionada solo con mi teléfono.

¿Fue útil?

Solución

He realizado algunas pruebas en diferentes teléfonos inteligentes. Aquí están los resultados:

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

Tenga en cuenta que las pruebas se han realizado utilizando un bloqueo de estela parcial. Sin él, el Nexus S no proporciona datos en absoluto cuando está dormido.

También hay una lista útil de teléfonos inteligentes que los acelerómetros envían (o no) datos compatibles cuando están dormidos: http://www.saltwebsites.com/2012/android-accelerometers-screen-off

Otros consejos

No conecte su teléfono a una PC a través de USB mientras toma datos porque durante los datos de recolección se registran solo en la tarjeta SD. Cuando el teléfono está conectado a PC a través de USB, no se puede guardar el archivo en la tarjeta SD.

Así que intente desconectar el USB mientras recopila los datos.

Desafortunadamente, como lo sugiere otras respuestas, la demora (o la tasa de muestreo) que establece es solo una sugerencia (para el sistema) del mínimo que requiere su aplicación, sin embargo, esto puede cambiar drásticamente dependiendo de otras aplicaciones que se ejecutan o que su dispositivo ingrese al ahorro de energía Modos (apagar la CPU, etc.). Una forma en que pude obtener una tasa de muestreo algo buena fue registrando mis datos de un servicio, haciendo del servicio un servicio en primer plano y teniendo un bloqueo de energía con la bandera parcial_wake_lock.

Puse el código en esta esenciahttps://gist.github.com/julian-ramos/6ee7ad8a74ee4b442530

Que GIST tiene mucho más código del que necesita, pero solo presta atención a los siguientes dos métodos

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

El código anterior evita que el sistema operativo apague la CPU

Ahora para hacer de este servicio un servicio en primer plano

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

El código anterior hace que el servicio sea una prioridad para el sistema operativo a diferencia de un servicio normal. Los ejemplos de un servicio en primer plano son los reproductores de música, por ejemplo.

Con este código, he podido obtener la tasa de muestreo que necesito incluso después de que el giro del reloj fuera de la pantalla automáticamente.

Verifique esta aplicación Hemos fijado la frecuencia de muestreo en 14-15 independientemente del modelo de dispositivo https://market.android.com/details?id=singh.pal.ajeet&feature=search_result#?t=w251bgwsswxldesinnpbmdolnbhbc5hamvldcjdPara cualquier asistencia, envíenos un correo electrónico a desarrollador.virtuoid@gmail.com

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top