Es gibt auch einige andere Methoden, um Verwacklungsbewegungen zu erkennen. Schau dir diesen Link an. (Wenn dieser Link nicht funktioniert oder der Link tot ist, sehen Sie sich dieses Webarchiv an .)
Schauen Sie sich dieses Beispiel für Android Shake Detect Listener an.
Ich finde, dass Sie die Empfindlichkeit je nach Gerät ändern wird. Was auf dem Galaxy Nexus als völlig akzeptable Shake-Erkennung erschien, muss auf einer Galaxy III, auf der dieselbe App ausgeführt wird, ein viel heftigeres Shake sein. Wenn ich es für dieses Gerät weniger empfindlich mache, ist es für so etwas wie den Nexus zu empfindlich. hmmmmmmm.
Topwik
Warum mit 10000 multipliziert und sollte der Nenner in Klammern stehen?
Yoda
3
Dies funktioniert, aber Sie sollten die Mathematik überprüfen, um die Beschleunigung zu berechnen: Die von den Sensoren zurückgegebenen Werte sind in m / s ^ 2 angegeben - es besteht keine Notwendigkeit, durch die Zeit zu teilen. Vielleicht möchten Sie auch sehen, wie Sie die Beschleunigungsvektoren multiplizieren.
@ RanyAlbegWein bist du sicher? Ich habe die Dokumente und die IDE überprüft und es wurden keine durchgestrichenen oder veralteten Warnungen angezeigt.
Neon Warge
Veraltet ... Meistens alles veraltet.
Pratik Butani
33
Sie können auch einen Blick auf die Bibliothek Seismic werfen
// 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 Methoden zum Überschreiben:
@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}
Wenn Sie fertig sind
// Stop listening for shakes
mSensorMgr.unregisterListener(this);
Zuletzt habe ich überprüft, ob der Tiefpassfilter [Alpha * Strom + (1-Alpha) * Vorheriger] ist, und 0,9 (Alpha?) Ist vollständig von der Abtastrate des Sensors abhängig, z. B. sollte für 100 ms Alpha 0,146 ish sein, und Sie können nicht davon ausgehen Alle Geräte verwenden genau die gleiche Sensorrate.
Flucht-llc
Ich bin ziemlich neu in Android. Können Sie mir helfen zu verstehen, warum onResume und onPause aufgerufen werden, wenn der Bildschirm wackelt? Ich verstehe diesen Teil nicht.
Pikamander2
1
@ Pikamander2 Wir müssen einen Listener in sensorManager registrieren. Wir haben dies in onResume getan und die Registrierung des Listeners in onPause aufgehoben. Wenn der Benutzer die App verlassen hat, funktioniert dieser Listener erst, wenn der Benutzer zur App zurückkehrt.
Dies ist für Kotlinund VerwendungSensorEventListener
Neue Klasse erstellen 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}}
Ihre Hauptaktivität
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()}})}}
Fügen Sie diesen Code schließlich zu Manifests hinzu, um sicherzustellen, dass das Telefon über einen Beschleunigungsmesser verfügt
Ich versuche festzustellen, ob der Benutzer das Telefon dreimal geschüttelt und dann ein Audio
abgespielt hat
Code wie dieser (und viele andere ähnliche Beispiele) erkennt nur eine anhaltende Beschleunigungsperiode, nicht unbedingt ein Schütteln. Die Hin- und Herbewegung, bei der es sich tatsächlich um eine Beschleunigung gefolgt von einer negativen Beschleunigung handelt, wird nicht erkannt.
Flucht-llc
1
Vergessen Sie nicht, diesen Code in Ihr MainActivity.java:
Antworten:
Aus Code-Sicht müssen Sie den SensorListener implementieren:
Sie müssen einen SensorManager erwerben:
Und registrieren Sie diesen Sensor mit den gewünschten Flags:
In Ihrer onSensorChange () -Methode bestimmen Sie, ob es sich um einen Shake handelt oder nicht:
Die Schüttelschwelle ist definiert als:
Es gibt auch einige andere Methoden, um Verwacklungsbewegungen zu erkennen. Schau dir diesen Link an. (Wenn dieser Link nicht funktioniert oder der Link tot ist, sehen Sie sich dieses Webarchiv an .)
Schauen Sie sich dieses Beispiel für Android Shake Detect Listener an.
Hinweis:
SensorListener
ist veraltet. wir könnenSensorEventListener
stattdessen verwenden. Hier ist ein kurzes Beispiel mit SensorEventListener.Vielen Dank.
quelle
Google hilft sehr .
quelle
java.lang.SecurityException: Requires VIBRATE permission
SensorManager.DATA_[X,Y,Z]
sind jetzt veraltet.Sie können auch einen Blick auf die Bibliothek Seismic werfen
quelle
Es gibt bereits viele Lösungen für diese Frage, aber ich wollte eine veröffentlichen, die:
Hier ist eine solche Lösung:
So initialisieren Sie den Timer:
SensorEventListener
Methoden zum Überschreiben:Wenn Sie fertig sind
quelle
Da SensorListener ist veraltet , so verwenden Sie folgenden Code:
Dann:
Die Frage mit allen Details finden Sie hier:
Android: Ich möchte es schütteln
quelle
Sie können Seismic verwenden :
Siehe den Code hier:
https://github.com/square/seismic/blob/master/library/src/main/java/com/squareup/seismic/ShakeDetector.java
quelle
Dies ist für
Kotlin
und VerwendungSensorEventListener
Neue Klasse erstellen
ShakeDetector
Ihre Hauptaktivität
Fügen Sie diesen Code schließlich zu Manifests hinzu, um sicherzustellen, dass das Telefon über einen Beschleunigungsmesser verfügt
quelle
Mach Folgendes:
Fügen Sie dies in die onCreate-Methode ein.
Und jetzt der Hauptteil.
quelle
Vergessen Sie nicht, diesen Code in Ihr
MainActivity.java
:MainActivity.java
Oder ich gebe dir einen Link zu diesem Zeug.
quelle