Existem também alguns outros métodos para detectar movimentos de vibração. olhe este link. (Se esse link não funcionar ou se ele estiver morto, dê uma olhada neste arquivo da web .).
Dê uma olhada neste exemplo para ouvinte de detecção de vibração do Android.
Acho que a sensibilidade mudará com base no dispositivo. o que parecia ser uma detecção de vibração perfeitamente aceitável no nexo da galáxia tem que ser uma vibração muito mais violenta em um galáxia III rodando o mesmo aplicativo. se eu torná-lo menos sensível para este dispositivo, ficará muito sensível em algo como o Nexus. hmmmmmmm.
topwik
Por que multiplicar por 10000 e deve haver parênteses no denominador?
Yoda
3
Isso funciona, mas você pode querer fazer uma verificação matemática para calcular a aceleração: Os valores retornados pelos sensores estão em m / s ^ 2 - não há necessidade de dividir pelo tempo. Além disso, você pode querer ver como multiplica os vetores de aceleração.
// 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 substituir:
@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}
Quando estiver tudo pronto
// Stop listening for shakes
mSensorMgr.unregisterListener(this);
A última vez que verifiquei o filtro passa-baixa é [alfa * atual + (1-alfa) * anterior], e 0,9 (alfa?) É totalmente dependente da taxa de amostragem do sensor, por exemplo, para 100 ms, o alfa deve ser 0,146 ish, e você não pode assumir todos os dispositivos usam exatamente a mesma taxa de sensor.
escape-llc
Sou muito novo no Android. Você poderia me ajudar a entender por que onResume e onPause são chamados quando a tela treme? Eu não entendo essa parte.
Pikamander2
1
@ Pikamander2 Precisamos registrar um ouvinte no sensorManager. Fizemos isso em onResume e cancelar o registro do ouvinte em onPause para que, quando o usuário saia do aplicativo, esse ouvinte não funcione até que o usuário volte ao aplicativo.
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}}
Sua atividade 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()}})}}
Por fim, adicione este código aos manifestos para garantir que o telefone tenha um acelerômetro
Estou tentando detectar se o usuário balançou o telefone três vezes e, em seguida, reproduzi um áudio ...
Si8
Código como este (e muitos outros exemplos semelhantes) detecta apenas um período sustentado de aceleração, não necessariamente tremendo. Ele não detectará o movimento para frente e para trás, que na verdade é uma aceleração seguida por uma aceleração negativa.
escape-llc
1
Não se esqueça de adicionar este código em MainActivity.java:
Respostas:
Do ponto de vista do código, você precisa implementar o SensorListener:
Você precisará adquirir um SensorManager:
E registre este sensor com os sinalizadores desejados:
Em seu método onSensorChange (), você determina se é um shake ou não:
O limite de vibração é definido como:
Existem também alguns outros métodos para detectar movimentos de vibração. olhe este link. (Se esse link não funcionar ou se ele estiver morto, dê uma olhada neste arquivo da web .).
Dê uma olhada neste exemplo para ouvinte de detecção de vibração do Android.
Nota:
SensorListener
está obsoleto. podemos usar em seuSensorEventListener
lugar. Aqui está um exemplo rápido usando SensorEventListener.Obrigado.
fonte
O Google ajuda muito .
fonte
java.lang.SecurityException: Requires VIBRATE permission
SensorManager.DATA_[X,Y,Z]
agora estão obsoletos.Você também pode dar uma olhada na biblioteca Seismic
fonte
Já existem muitas soluções para essa questão, mas eu gostaria de postar uma que:
Aqui está essa solução:
Para inicializar o cronômetro:
SensorEventListener
métodos para substituir:Quando estiver tudo pronto
fonte
Como o SensorListener está obsoleto , use o seguinte código:
Então:
A pergunta com todos os detalhes pode ser encontrada aqui:
Android: quero sacudir
fonte
Você pode usar o Sísmico :
Veja o código aqui:
https://github.com/square/seismic/blob/master/library/src/main/java/com/squareup/seismic/ShakeDetector.java
fonte
Isto é para
Kotlin
e usoSensorEventListener
Criar nova classe
ShakeDetector
Sua atividade principal
Por fim, adicione este código aos manifestos para garantir que o telefone tenha um acelerômetro
fonte
Faça o seguinte:
Coloque isso no método onCreate.
E agora a parte principal.
fonte
Não se esqueça de adicionar este código em
MainActivity.java
:MainActivity.java
Ou eu te dou um link sobre essas coisas.
fonte