Skip to content

Instantly share code, notes, and snippets.

@Sprajapati123
Created June 17, 2024 02:08
Show Gist options
  • Save Sprajapati123/a539d3fa4730a0ad185746b1385b1160 to your computer and use it in GitHub Desktop.
Save Sprajapati123/a539d3fa4730a0ad185746b1385b1160 to your computer and use it in GitHub Desktop.
Detecting shake in android application
package com.example.crud_34b.ui.activity
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.crud_34b.R
import com.example.crud_34b.databinding.ActivityAccelerometerSensorBinding
import kotlin.math.sqrt
class AccelerometerSensorActivity : AppCompatActivity(),SensorEventListener {
lateinit var accelerometerSensorBinding: ActivityAccelerometerSensorBinding
lateinit var sensorManager: SensorManager
lateinit var sensor: Sensor
private var lastShakeTime: Long = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
accelerometerSensorBinding = ActivityAccelerometerSensorBinding.inflate(layoutInflater)
setContentView(accelerometerSensorBinding.root)
sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
if(!checkSensor()){
return
}else{
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)!!
sensorManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_NORMAL)
}
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
private fun checkSensor() : Boolean{
var flag = true
if(sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) == null){
flag = false
}
return flag
}
override fun onSensorChanged(event: SensorEvent?) {
val values = event!!.values
val xAxis = values[0]
val yAxis = values[1]
val zAxis = values[2]
accelerometerSensorBinding.lblAccelerometer.text = "x: $xAxis y: $yAxis z: $zAxis"
detectShake(xAxis, yAxis, zAxis)
}
private fun detectShake(x: Float, y: Float, z: Float) {
val accelerationMagnitude = sqrt((x * x + y * y + z * z).toDouble()).toFloat()
val shakeThreshold = 12.0f
val currentTime = System.currentTimeMillis()
if (accelerationMagnitude > shakeThreshold) {
if (currentTime - lastShakeTime > 500) { // 500 ms delay to prevent multiple triggers
lastShakeTime = currentTime
showAlert()
}
}
}
private fun showAlert() {
AlertDialog.Builder(this)
.setTitle("Shake Detected")
.setMessage("You have shaken the device!")
.setPositiveButton("OK") { dialog, _ -> dialog.dismiss() }
.show()
}
override fun onAccuracyChanged(p0: Sensor?, p1: Int) {
}
override fun onPause() {
super.onPause()
// Unregister the sensor listener
sensorManager.unregisterListener(this)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment