Ada beberapa metode lain juga, untuk mendeteksi gerakan goyang. lihat tautan ini . (Jika tautan itu tidak berfungsi atau tautan mati, lihat arsip web ini .).
Lihat contoh ini untuk pendengar deteksi goyang android.
Saya menemukan bahwa sensitivitas Anda akan berubah berdasarkan perangkat. apa yang tampak seperti deteksi goyangan yang dapat diterima di galaksi nexus adalah goyangan yang jauh lebih hebat di galaksi III yang menjalankan aplikasi yang sama. jika saya membuatnya kurang sensitif untuk perangkat ini, itu akan menjadi terlalu sensitif pada sesuatu seperti nexus. hmmmmmmm.
topwik
Mengapa dikalikan dengan 10000 dan apakah harus ada tanda kurung di penyebut?
Yoda
3
Ini berfungsi, tetapi Anda mungkin ingin memeriksa matematika untuk menghitung percepatan: Nilai yang dikembalikan oleh sensor dalam m / s ^ 2 - tidak perlu membagi dengan waktu. Selain itu, Anda mungkin ingin melihat cara mengalikan vektor percepatan.
// 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 metode untuk mengganti:
@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}
Ketika Anda sudah selesai
// Stop listening for shakes
mSensorMgr.unregisterListener(this);
Terakhir saya memeriksa filter low-pass adalah [alpha * current + (1-alpha) * sebelumnya], dan 0,9 (alpha?) Sepenuhnya bergantung pada sample rate sensor, misalnya untuk 100ms alpha harus 0,146 ish, dan Anda tidak dapat berasumsi semua perangkat menggunakan tingkat sensor yang sama persis.
escape-llc
Saya cukup baru mengenal Android. Bisakah Anda membantu saya memahami mengapa onResume dan onPause dipanggil saat layar bergetar? Saya tidak mengerti bagian itu.
Pikamander2
1
@ Pikamander2 Kita perlu mendaftarkan pendengar di sensorManager, Kita melakukannya di onResume dan membatalkan pendaftaran pendengar di onPause sehingga saat pengguna keluar dari aplikasi, pendengar ini tidak akan berfungsi hingga pengguna kembali ke aplikasi.
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}}
Aktivitas utama Anda
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()}})}}
Terakhir, tambahkan kode ini ke Manifes untuk memastikan ponsel memiliki akselerometer
Saya mencoba mendeteksi jika pengguna menggoyangkan telepon tiga kali dan kemudian memutar audio ...
Si8
Kode seperti ini (dan banyak contoh serupa lainnya) hanya mendeteksi periode akselerasi yang berkelanjutan, tidak harus gemetar. Itu tidak akan mendeteksi gerakan maju mundur, yang sebenarnya adalah percepatan yang diikuti dengan percepatan negatif.
escape-llc
1
Jangan lupa untuk menambahkan kode ini di MainActivity.java:
Jawaban:
Dari sudut pandang kode, Anda perlu mengimplementasikan SensorListener:
Anda perlu mendapatkan SensorManager:
Dan daftarkan sensor ini dengan flag yang diinginkan:
Dalam metode onSensorChange (), Anda menentukan apakah itu goyang atau tidak:
Ambang batas goyang didefinisikan sebagai:
Ada beberapa metode lain juga, untuk mendeteksi gerakan goyang. lihat tautan ini . (Jika tautan itu tidak berfungsi atau tautan mati, lihat arsip web ini .).
Lihat contoh ini untuk pendengar deteksi goyang android.
Catatan:
SensorListener
tidak digunakan lagi. kita bisa gunakanSensorEventListener
sebagai gantinya. Berikut adalah contoh cepat menggunakan SensorEventListener.Terima kasih.
sumber
Google banyak membantu .
sumber
java.lang.SecurityException: Requires VIBRATE permission
SensorManager.DATA_[X,Y,Z]
sekarang tidak lagi digunakan.Anda juga dapat melihat perpustakaan Seismic
sumber
Ada banyak solusi untuk pertanyaan ini, tetapi saya ingin memposting yang:
Inilah solusinya:
Untuk menginisialisasi timer:
SensorEventListener
metode untuk mengganti:Ketika Anda sudah selesai
sumber
Karena SensorListener tidak digunakan lagi, gunakan kode berikut:
Kemudian:
Pertanyaan dengan detail lengkap dapat ditemukan di sini:
Android: Saya ingin mengguncangnya
sumber
Anda dapat menggunakan Seismic :
Lihat kodenya di sini:
https://github.com/square/seismic/blob/master/library/src/main/java/com/squareup/seismic/ShakeDetector.java
sumber
Ini untuk
Kotlin
dan digunakanSensorEventListener
Buat kelas baru
ShakeDetector
Aktivitas utama Anda
Terakhir, tambahkan kode ini ke Manifes untuk memastikan ponsel memiliki akselerometer
sumber
Lakukan hal berikut:
Masukkan ini ke dalam metode onCreate.
Dan sekarang bagian utamanya.
sumber
Jangan lupa untuk menambahkan kode ini di
MainActivity.java
:MainActivity.java
Atau saya memberi Anda tautan tentang hal ini.
sumber