tutorial studio sensors sensores example android sensor accelerator

studio - Android-Aceleración hacia abajo(aplastar)



orientation sensor android (2)

Video explicativo para aquellos que no entienden

ESTA RESPUESTA NO SE RESPONDE CORRECTAMENTE POR FAVOR INTENTE RESPONDERLO CON OTRA SOLUCIÓN (100 Bounty está desactualizado)

La misma pregunta pero mejor explicada

Esta pregunta fue aceptada como correcta pero no lo es en absoluto, la probé con mi dispositivo ZTE anterior y funcionó la mayor parte del tiempo, pero ahora tengo un Samsung Galazy A5 2016 y no funciona, ni en un LG G3 .

La cuestión es intentar usar el Accelerometer y algunos Sensors Tengo que poder detectar cualquiera de esos dos movimientos que hice en el video.

Hay dos movimientos:

  • Rompiéndolo (con un poco de velocidad)
  • Caida libre

Te dejo decidir y convencerme de cuál es la mejor opción y MÁS FÁCIL de hacer, con mejor quiero decir que funciona en la mayoría de los dispositivos.


Si desea ver si el dispositivo está en caída libre, debe verificar si lo normal está más cerca de cero. developer.android.com/guide/topics/sensors/sensors_motion.html

public void onSensorChanged(SensorEvent event) { double noraml = Math.sqrt(Math.pow(event.values[0].getX(),2)+ Math.pow(event.values[1].getY(),2)+ Math.pow(event.values[2].getZ(),2)); if (normal < 0) return true; return false; }


Un dispositivo estacionario tendrá un valor de gravedad de +9.81, que corresponde a la aceleración del dispositivo (0 m / s2 menos la fuerza de gravedad, que es -9.81 m / s2). Por lo tanto, si el dispositivo se mueve hacia abajo desde la posición estacionaria, la gravedad será inferior a 9.81. Un dispositivo de caída libre tendrá una gravedad igual a 0.

A continuación se muestra cómo determinar si el dispositivo comienza a moverse hacia abajo. No podrá determinar si el dispositivo se está moviendo hacia abajo si el dispositivo ya se está moviendo hacia abajo con velocidad constante, ya que en este caso no hay aceleración hacia abajo y la norma de gravedad debería estar alrededor de 9.81.

Debes usar TYPE_GRAVITY . Si el dispositivo no tiene TYPE_GRAVITY , entonces el filtro de paso bajo TYPE_ACCELEROMETER para obtener el vector de gravedad.

Como anteriormente, un dispositivo estacionario tendrá un vector de gravedad con una norma igual a 9.81. Sin embargo, este valor variará ligeramente con los dispositivos. Por lo tanto, primero debe determinar esta norma de gravedad estacionaria. Puede hacerlo registrándose en TYPE_GRAVITY o TYPE_ACCELEROMETER y solicite al usuario que coloque el dispositivo plano y luego presione un botón. Una vez que se presiona el botón, la aplicación calculará la norma de la gravedad en onSensorChanged.

private float mStationaryGravityNorm; private float mDeviation = 0.01; private float mCount; private boolean mIsCalculatingStationGravityNorm = true; Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener( { @Override public void onClick(View v) { // register sensor } }); @Override public void onSensorChanged(SensorEvent event) { // Will average out 100 gravity values. if (mIsCalculatingStationGravityNorm) { if (mCount++ < 100) { mStationaryGravityNorm += Math.sqrt(event.values[0] * event.values[0] + event.values[1] * event.values[1] + event.values[2] * event.values[2]); } else { mStationaryGravityNorm /= 100; mIsCalculatingStationGravityNorm = false; } else { float gravityNorm = Math.sqrt(event.values[0] * event.values[0] + event.values[1] * event.values[1] + event.values[2] * event.values[2]); if (gravityNorm < mStationaryGravityNorm - mDeviation) { // moving down } }

PD: Para subir y bajar quieres calcular la gravedad. Cuando el dispositivo está estacionario, la norma de gravedad es de aproximadamente 9.81 (dependiendo del dispositivo). Ahora, si el dispositivo se mueve hacia abajo, hay una aceleración hacia abajo, por lo tanto, la norma de gravedad será inferior a 9.81 y si el dispositivo se mueve hacia arriba, la norma de gravedad será superior a 9.81. Al comparar la norma de gravedad con esta norma de gravedad estacionaria, sabrá si el dispositivo se mueve hacia arriba o hacia abajo. Esto es independiente de la orientación del dispositivo. TYPE_GRAVITY dará una mayor precisión, pero si el dispositivo no tiene este tipo, entonces el filtro de paso bajo TYPE_ACCELERATOR le dará el vector de gravedad.