Il existe également d'autres méthodes pour détecter les mouvements de secousse. regardez ce lien. (Si ce lien ne fonctionne pas ou si le lien est mort, consultez cette archive Web .).
Jetez un œil à cet exemple pour l'auditeur de détection de secousse Android.
Je trouve que vous la sensibilité changera en fonction de l'appareil. ce qui semblait être une détection de tremblement parfaitement acceptable sur le Galaxy Nexus doit être un tremblement beaucoup plus violent sur un Galaxy III exécutant la même application. si je le rends moins sensible pour cet appareil, il sera trop sensible sur quelque chose comme le nexus. hmmmmmmm.
topwik
Pourquoi multiplié par 10000 et y a-t-il des parenthèses dans le dénominateur?
Yoda
3
Cela fonctionne, mais vous voudrez peut-être vérifier les mathématiques pour calculer l'accélération: Les valeurs renvoyées par les capteurs sont en m / s ^ 2 - il n'est pas nécessaire de diviser par le temps. En outre, vous voudrez peut-être regarder comment vous multipliez les vecteurs d'accélération.
// 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éthodes à remplacer:
@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}
Quand tu as tout fini
// Stop listening for shakes
mSensorMgr.unregisterListener(this);
Le dernier filtre passe-bas vérifié est [alpha * courant + (1-alpha) * précédent], et le 0.9 (alpha?) Dépend complètement de la fréquence d'échantillonnage du capteur, par exemple pour 100 ms alpha devrait être de 0,146 ish, et vous ne pouvez pas supposer tous les appareils utilisent exactement la même fréquence de capteur.
escape-llc
Je suis assez nouveau sur Android. Pouvez-vous m'aider à comprendre pourquoi onResume et onPause sont appelés lorsque l'écran tremble? Je ne comprends pas cette partie.
Pikamander2
1
@ Pikamander2 Nous devons enregistrer un auditeur dans sensorManager.Nous l'avons fait dans onResume et désenregistrer l'auditeur dans onPause.Ainsi, lorsque l'utilisateur a quitté l'application, cet auditeur ne fonctionnera pas tant que l'utilisateur ne reviendra pas sur l'application.
Ceci est pour Kotlinet utiliserSensorEventListener
Créer une nouvelle classe ShakeDetector
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}}
Votre activité principale
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()}})}}
Enfin, ajoutez ce code à Manifests pour vous assurer que le téléphone dispose d'un accéléromètre
J'essaie de détecter si l'utilisateur a secoué le téléphone trois fois, puis joue un son ...
Si8
Un code comme celui-ci (et de nombreux autres exemples similaires) ne détecte qu'une période d'accélération prolongée, pas nécessairement de tremblements. Il ne détectera pas le mouvement de va-et-vient, qui est en fait une accélération suivie d'une accélération négative.
escape-llc
1
N'oubliez pas d'ajouter ce code dans votre MainActivity.java:
Réponses:
Du point de vue du code, vous devez implémenter le SensorListener:
Vous devrez acquérir un SensorManager:
Et enregistrez ce capteur avec les drapeaux souhaités:
Dans votre méthode onSensorChange (), vous déterminez s'il s'agit d'un shake ou non:
Le seuil d'agitation est défini comme:
Il existe également d'autres méthodes pour détecter les mouvements de secousse. regardez ce lien. (Si ce lien ne fonctionne pas ou si le lien est mort, consultez cette archive Web .).
Jetez un œil à cet exemple pour l'auditeur de détection de secousse Android.
Remarque:
SensorListener
est obsolète. nous pouvons utiliser à laSensorEventListener
place. Voici un exemple rapide utilisant SensorEventListener.Merci.
la source
Google aide beaucoup .
la source
java.lang.SecurityException: Requires VIBRATE permission
SensorManager.DATA_[X,Y,Z]
sont désormais obsolètes.Vous pouvez également jeter un œil à la bibliothèque Seismic
la source
Il y a déjà beaucoup de solutions à cette question, mais je voulais en poster une qui:
Voici une telle solution:
Pour initialiser la minuterie:
SensorEventListener
méthodes à remplacer:Quand tu as tout fini
la source
Étant donné que SensorListener est obsolète , utilisez le code suivant:
Ensuite:
La question avec tous les détails peut être trouvée ici:
Android: je veux le secouer
la source
Vous pouvez utiliser Seismic :
Voir le code ici:
https://github.com/square/seismic/blob/master/library/src/main/java/com/squareup/seismic/ShakeDetector.java
la source
Ceci est pour
Kotlin
et utiliserSensorEventListener
Créer une nouvelle classe
ShakeDetector
Votre activité principale
Enfin, ajoutez ce code à Manifests pour vous assurer que le téléphone dispose d'un accéléromètre
la source
Procédez comme suit:
Mettez ceci dans la méthode onCreate.
Et maintenant la partie principale.
la source
N'oubliez pas d'ajouter ce code dans votre
MainActivity.java
:MainActivity.java
Ou je vous donne un lien sur ce truc.
la source