Я считаю, что чувствительность будет меняться в зависимости от устройства. то, что казалось вполне приемлемым обнаружением сотрясения в нексусе галактики, должно быть гораздо более сильным встряхиванием в галактике III с тем же приложением. если я сделаю его менее чувствительным для этого устройства, он будет слишком чувствителен к чему-то вроде нексуса. Hmmmmmmm.
topwik
Почему умножить на 10000 и должны ли быть скобки в знаменателе?
Йода
3
Это работает, но вы можете проверить математику для расчета ускорения: значения, возвращаемые датчиками, выражаются в м / с ^ 2 - нет необходимости делить на время. Кроме того, вы можете посмотреть, как вы умножаете векторы ускорения.
// 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 методы для переопределения:
@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}
Когда все будет готово
// Stop listening for shakes
mSensorMgr.unregisterListener(this);
Последний раз я проверял фильтр нижних частот [альфа * текущий + (1-альфа) * предыдущий], а 0,9 (альфа?) Полностью зависит от частоты дискретизации датчика, например, для 100 мс альфа должна быть 0,146 иш, и вы не можете предположить все устройства используют одинаковую частоту датчика.
escape-
Я новичок в Android. Не могли бы вы помочь мне понять, почему onResume и onPause вызываются при дрожании экрана? Я не понимаю этого.
Pikamander2 08
1
@ Pikamander2 Нам нужно зарегистрировать слушателя в sensorManager. Мы сделали это в onResume и отменили регистрацию слушателя в onPause, поэтому, когда пользователь покинет приложение, этот слушатель не будет работать, пока пользователь не вернется в приложение.
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}}
Ваша основная деятельность
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()}})}}
Наконец, добавьте этот код в манифесты, чтобы убедиться, что в телефоне есть акселерометр.
Я пытаюсь определить, потряс ли пользователь телефон три раза, а затем воспроизвести звук ...
Si8
Код, подобный этому (и многим другим подобным примерам), обнаруживает только длительный период ускорения, не обязательно дрожание. Он не обнаруживает возвратно-поступательное движение, которое на самом деле является ускорением, за которым следует отрицательное ускорение.
escape-
1
Не забудьте добавить этот код в свой MainActivity.java:
Ответы:
С точки зрения кода вам необходимо реализовать SensorListener:
Вам нужно будет приобрести SensorManager:
И зарегистрируйте этот датчик с желаемыми флагами:
В вашем методе onSensorChange () вы определяете, встряска это или нет:
Порог встряхивания определяется как:
Есть и другие методы обнаружения дрожания. посмотрите эту ссылку. (Если эта ссылка не работает или ссылка не работает, посмотрите этот веб-архив .).
Взгляните на этот пример для прослушивателя обнаружения встряхивания Android.
Примечание:
SensorListener
устарело. мы можем использоватьSensorEventListener
вместо этого. Вот быстрый пример использования SensorEventListener.Спасибо.
источник
Google очень помогает .
источник
java.lang.SecurityException: Requires VIBRATE permission
SensorManager.DATA_[X,Y,Z]
устарели.Вы также можете ознакомиться с библиотекой Seismic
источник
На этот вопрос уже есть много решений, но я хотел опубликовать одно, которое:
Вот такое решение:
Чтобы инициализировать таймер:
SensorEventListener
методы для переопределения:Когда все будет готово
источник
Поскольку SensorListener является устаревшим , так что используйте следующий код:
Затем:
Подробный вопрос можно найти здесь:
Андроид: хочу встряхнуть
источник
Вы можете использовать Seismic :
Смотрите код здесь:
https://github.com/square/seismic/blob/master/library/src/main/java/com/squareup/seismic/ShakeDetector.java
источник
Это для
Kotlin
и использованияSensorEventListener
Создать новый класс
ShakeDetector
Ваша основная деятельность
Наконец, добавьте этот код в манифесты, чтобы убедиться, что в телефоне есть акселерометр.
источник
Сделайте следующее:
Поместите это в метод onCreate.
А теперь основная часть.
источник
Не забудьте добавить этот код в свой
MainActivity.java
:MainActivity.java
Или даю ссылку по этому поводу.
источник