Skip to content Skip to sidebar Skip to footer

Detect Shake In Android

I am trying to hit an API when user shake a device 10 times. I have tried many git sample and stack overflow solution but non of them did solve my problem. Some of them detecting s

Solution 1:

I have done that using this library :

1) Add the dependecy in your build.gridle file

allprojects {
  repositories {
    ...
    maven { url 'https://jitpack.io' }
  }
}

dependencies {
   compile'com.github.safetysystemtechnology:android-shake-detector:v1.2'
}

2) Give the permission to your app manifest file

<uses-featureandroid:name="android.hardware.sensor.accelerometer"android:required="true" />

if you will run in background, register your broadcast receiver

<receiverandroid:name=".ShakeReceiver"><intent-filter><actionandroid:name="shake.detector" /></intent-filter></receiver>

3) start that in onCreate method Like this :

privateShakeDetector shakeDetector;

@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    buildView();

    ShakeOptions options = newShakeOptions()
            .background(true)
            .interval(1000)
            .shakeCount(2)
            .sensibility(2.0f);

    this.shakeDetector = newShakeDetector(options).start(this, newShakeCallback() {
        @OverridepublicvoidonShake() {
            Log.d("event", "onShake");
        }
    });

    //IF YOU WANT JUST IN BACKGROUND//this.shakeDetector = new ShakeDetector(options).start(this);
}

4) override onStop method and stop that

@OverrideprotectedvoidonStop() {
    super.onStop();
shakeDetector.stopShakeDetector(getBaseContext());
}

5) override onDistroy method and distroy like this :

@OverrideprotectedvoidonDestroy() {
    shakeDetector.destroy(getBaseContext());
    super.onDestroy();
}

(*) Optional step : if you will run in background, create your broadcast receiver

publicclassShakeReceiverextendsBroadcastReceiver {
    @OverridepublicvoidonReceive(Context context, Intent intent) {
        if (null != intent && intent.getAction().equals("shake.detector")) {
            ...
        }
    }
}

Solution 2:

By Using SensorListener

Please check this ticked answer...

You have to adjust SHAKE_THRESHOLD value to achieve this

How to detect shake event with android?

Thank you!

Solution 3:

have a static variable that gets incremented every time a shake is detected.

staticint count = 0;
publicvoidonSensorChanged(SensorEvent event) {
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;

        if (acceleration > SHAKE_THRESHOLD) {
            mLastShakeTime = curTime;
            count++;
            if(count==10){
                //your code goes here
            }
        }
    }
}

Post a Comment for "Detect Shake In Android"