Android: evita que la función de vibración del teléfono afecte a los datos del acelerómetro

He diseñado una aplicación que rastrea cuando me estoy moviendo con el acelerómetro, y puede vibrar el teléfono dependiendo de los diferentes umbrales que puede haber golpeado. Uno de los problemas que enfrenté es que esta vibración corrompe directamente los datos del acelerómetro.

Esta respuesta sugirió usar un filtro de paso bajo, pero no creo que funcione en esta aplicación (necesito un tiempo de respuesta relativamente rápido, y las vibraciones causan grandes picos en los datos).

La solución que estoy utilizando actualmente es establecer una bandera a la verdadera derecha antes de que el teléfono vibre, llamar a una función postDelayed que pondrá esto de nuevo a falso después de un cierto tiempo (1 segundo en fino), y en la función onSensorChanged , simplemente regrese si la bandera es verdadera.

En otras palabras:

 isPhoneVibrating = true; // Start to vibrate phoneVibrator.vibrate(VibratePattern, -1); mHandler.postDelayed(vibrateSensorOff, 1000); // 1 seconds wait before making false 

El vibrateSensorOff sólo contiene

 isPhoneVibrating = false; 

y como dije, en la función onSensorChanged regreso si la bandera isPhoneVibrating es verdadera.

No me gusta esta solución porque necesito administrar este indicador extra en los distintos estados de esta aplicación. ¿Hay otras soluciones posibles que no requieren una bandera adicional?

Usted podría tener dos singletons que seguir la pista si el teléfono está vibrando o no y administrar el Vibrator y el Accelerometer .

El gestor del Accelerometer debe exponer los métodos que utiliza para el Accelerometer y debe transmitir todos los eventos si el Vibrator no se está ejecutando (esto es como un filtro para los datos del acelerómetro). Usted debe tener una bandera interna para si el teléfono está vibrando en el administrador de Accelerometer y los métodos para configurarlo.

El administrador del Vibrator debe exponer los métodos que utiliza para el Vibrator y también debe actualizar el indicador del Administrador del Accelerometer cuando el teléfono empiece a vibrar.

Estos son básicamente envoltorios para las instancias de Vibrator y Accelerometer en tu aplicación, pero deberían permitirte usar el Accelerometer sin tener que preocuparte por el indicador de Vibrator en todas partes de tu aplicación (solo los objetos del administrador deberían cuidar esa bandera).

Sé que esta solución requiere una bandera extra, pero te permite administrar esa bandera en sólo dos lugares (en los dos singletons) y no tienes que seguirla en toda tu aplicación. Si implementas los dos singletons, asegúrate de no usar el Vibrator o el Accelerometer directamente (ya que tendrías que mantener un registro de la bandera de vibración para hacer eso).

  • ¿Cómo activar la vibración en la entrada de sonido?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.