También existen otros métodos para detectar movimiento de vibración. mira este enlace. (Si ese enlace no funciona o está inactivo, consulte este archivo web ).
Eche un vistazo a este ejemplo para el oyente de detección de sacudidas de Android.
Creo que la sensibilidad cambiará según el dispositivo. Lo que parecía una detección de sacudidas perfectamente aceptable en el Galaxy Nexus tiene que ser una sacudida mucho más violenta en un Galaxy III que ejecuta la misma aplicación. si lo hago menos sensible para este dispositivo, será demasiado sensible en algo como el nexus. hmmmmmmm.
topwik
¿Por qué multiplicado por 10000 y debería haber paréntesis en el denominador?
Yoda
3
Esto funciona, pero es posible que desee verificar las matemáticas para calcular la aceleración: los valores devueltos por los sensores están en m / s ^ 2; no es necesario dividir por tiempo. Además, es posible que desee ver cómo multiplica los vectores de aceleración.
// Get a sensor manager to listen for shakes
mSensorMgr =(SensorManager) getSystemService(SENSOR_SERVICE);// Listen for shakesSensor accelerometer = mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);if(accelerometer !=null){
mSensorMgr.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL);}
SensorEventListener métodos para anular:
@Overridepublicvoid onSensorChanged(SensorEventevent){if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){long curTime =System.currentTimeMillis();if((curTime - mLastShakeTime)> MIN_TIME_BETWEEN_SHAKES_MILLISECS){float x =event.values[0];float y =event.values[1];float z =event.values[2];double acceleration =Math.sqrt(Math.pow(x,2)+Math.pow(y,2)+Math.pow(z,2))-SensorManager.GRAVITY_EARTH;Log.d(APP_NAME,"Acceleration is "+ acceleration +"m/s^2");if(acceleration > SHAKE_THRESHOLD){
mLastShakeTime = curTime;Log.d(APP_NAME,"Shake, Rattle, and Roll");}}}}@Overridepublicvoid onAccuracyChanged(Sensor sensor,int accuracy){// Ignore}
Cuando hayas terminado
// Stop listening for shakes
mSensorMgr.unregisterListener(this);
La última vez que verifiqué que el filtro de paso bajo es [alfa * actual + (1-alfa) * anterior], y el 0,9 (¿alfa?) Depende completamente de la frecuencia de muestreo del sensor, por ejemplo, para 100 ms alfa debería ser 0,146 ish, y no se puede asumir todos los dispositivos utilizan exactamente la misma frecuencia de sensor.
escape-llc
Soy bastante nuevo en Android. ¿Podría ayudarme a entender por qué se llama a onResume y onPause cuando la pantalla tiembla? No entiendo esa parte.
Pikamander2
1
@ Pikamander2 Necesitamos registrar un oyente en sensorManager, lo hicimos en onResume y anulamos el registro del oyente en onPause para que cuando el usuario salga de la aplicación, este oyente no funcionará hasta que el usuario vuelva a la aplicación.
classShakeDetector:SensorEventListener{privatevar mListener:OnShakeListener?=nullprivatevar mShakeTimestamp:Long=0privatevar mShakeCount =0
fun setOnShakeListener(listener:OnShakeListener?){
mListener = listener
}interfaceOnShakeListener{
fun onShake(count:Int)}override fun onAccuracyChanged(
sensor:Sensor,
accuracy:Int){// ignore}override fun onSensorChanged(event:SensorEvent){if(mListener !=null){
val x =event.values[0]
val y =event.values[1]
val z =event.values[2]
val gX = x /SensorManager.GRAVITY_EARTH
val gY = y /SensorManager.GRAVITY_EARTH
val gZ = z /SensorManager.GRAVITY_EARTH
// gForce will be close to 1 when there is no movement.
val gForce:Float= sqrt(gX * gX + gY * gY + gZ * gZ)if(gForce > SHAKE_THRESHOLD_GRAVITY){
val now =System.currentTimeMillis()// ignore shake events too close to each other (500ms)if(mShakeTimestamp + SHAKE_SLOP_TIME_MS > now){return}// reset the shake count after 3 seconds of no shakesif(mShakeTimestamp + SHAKE_COUNT_RESET_TIME_MS < now){
mShakeCount =0}
mShakeTimestamp = now
mShakeCount++
mListener!!.onShake(mShakeCount)}}}
companion object{/*
* The gForce that is necessary to register as shake.
* Must be greater than 1G (one earth gravity unit).
* You can install "G-Force", by Blake La Pierre
* from the Google Play Store and run it to see how
* many G's it takes to register a shake
*/privateconst val SHAKE_THRESHOLD_GRAVITY =2.7fprivateconst val SHAKE_SLOP_TIME_MS =500privateconst val SHAKE_COUNT_RESET_TIME_MS =3000}}
Tu actividad principal
classMainActivity:AppCompatActivity(){// The following are used for the shake detectionprivatevar mSensorManager:SensorManager?=nullprivatevar mAccelerometer:Sensor?=nullprivatevar mShakeDetector:ShakeDetector?=nulloverride fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initSensor()}override fun onResume(){super.onResume()// Add the following line to register the Session Manager Listener onResume
mSensorManager!!.registerListener(
mShakeDetector,
mAccelerometer,SensorManager.SENSOR_DELAY_UI
)}override fun onPause(){// Add the following line to unregister the Sensor Manager onPause
mSensorManager!!.unregisterListener(mShakeDetector)super.onPause()}private fun initSensor(){// ShakeDetector initialization// ShakeDetector initialization
mSensorManager = getSystemService(SENSOR_SERVICE)asSensorManager
mAccelerometer = mSensorManager!!.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
mShakeDetector =ShakeDetector()
mShakeDetector!!.setOnShakeListener(object:OnShakeListener{override fun onShake(count:Int){/*
* The following method, "handleShakeEvent(count):" is a stub //
* method you would use to setup whatever you want done once the
* device has been shook.
*/Toast.makeText(this@MainActivity, count.toString(),Toast.LENGTH_SHORT).show()}})}}
Finalmente agregue este código a Manifests para asegurarse de que el teléfono tenga un acelerómetro
Estoy tratando de detectar si el usuario agitó el teléfono tres veces y luego reproducir un audio ...
Si8
Un código como este (y muchos otros ejemplos similares) solo detecta un período sostenido de aceleración, no necesariamente temblores. No detectará el movimiento de ida y vuelta, que en realidad es una aceleración seguida de una aceleración negativa.
escape-llc
1
No olvide agregar este código en su MainActivity.java:
Respuestas:
Desde el punto de vista del código, debe implementar SensorListener:
Necesitará adquirir un SensorManager:
Y registre este sensor con las banderas deseadas:
En su método onSensorChange (), determina si es un batido o no:
El umbral de agitación se define como:
También existen otros métodos para detectar movimiento de vibración. mira este enlace. (Si ese enlace no funciona o está inactivo, consulte este archivo web ).
Eche un vistazo a este ejemplo para el oyente de detección de sacudidas de Android.
Nota:
SensorListener
está en desuso. podemos usarSensorEventListener
en su lugar. Aquí hay un ejemplo rápido usando SensorEventListener.Gracias.
fuente
Google ayuda mucho .
fuente
java.lang.SecurityException: Requires VIBRATE permission
SensorManager.DATA_[X,Y,Z]
ahora están en desuso.También puede echar un vistazo a la biblioteca Seismic
fuente
Ya hay muchas soluciones para esta pregunta, pero quería publicar una que:
Aquí hay una solución de este tipo:
Para inicializar el temporizador:
SensorEventListener
métodos para anular:Cuando hayas terminado
fuente
Dado que SensorListener está obsoleto, utilice el siguiente código:
Luego:
La pregunta con todos los detalles se puede encontrar aquí:
Android: quiero agitarlo
fuente
Puede utilizar Seismic :
Vea el código aquí:
https://github.com/square/seismic/blob/master/library/src/main/java/com/squareup/seismic/ShakeDetector.java
fuente
Esto es para
Kotlin
usoSensorEventListener
Crear nueva clase
ShakeDetector
Tu actividad principal
Finalmente agregue este código a Manifests para asegurarse de que el teléfono tenga un acelerómetro
fuente
Haz lo siguiente:
Pon esto en el método onCreate.
Y ahora la parte principal.
fuente
No olvide agregar este código en su
MainActivity.java
:MainActivity.java
O te doy un enlace sobre estas cosas.
fuente