Android Open Source - AndroidShakeListener Shake Listener






From Project

Back to project page AndroidShakeListener.

License

The source code is released under:

MIT License

If you think the Android project AndroidShakeListener listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.rbonestell.androidshakelistener;
/*from   ww  w  .j  a v a  2  s . c  o m*/
import android.content.Context;
import android.hardware.SensorListener;
import android.hardware.SensorManager;

@SuppressWarnings("deprecation")
public class ShakeListener  implements SensorListener
{
  
  private static final int FORCE_THRESHOLD = 455;
  private static final int TIME_THRESHOLD = 100;
  private static final int SHAKE_TIMEOUT = 500;
  private static final int SHAKE_DURATION = 1500;
  private static final int SHAKE_COUNT = 5;

  private SensorManager mSensorMgr;
  private float mLastX=-1.0f, mLastY=-1.0f, mLastZ=-1.0f;
  private long mLastTime;
  private OnShakeListener mShakeListener;
  private Context mContext;
  private int mShakeCount = 0;
  private long mLastShake;
  private long mLastForce;
  
  public boolean supported;

  //Interface for passing shake events
  public interface OnShakeListener
  {
    public void onShake();
  }

  public ShakeListener(Context context) 
  { 
    mContext = context;
    resume();
  }

  public void setOnShakeListener(OnShakeListener listener)
  {
    mShakeListener = listener;
  }

  public void resume()
  {
    mSensorMgr = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
     
    if (mSensorMgr == null)
     {
        supported = false;
        return;
      }
      
    supported = mSensorMgr.registerListener(this, SensorManager.SENSOR_ACCELEROMETER, SensorManager.SENSOR_DELAY_FASTEST);
      
    if (!supported)
    {
        mSensorMgr.unregisterListener(this);
      }
  }

  public void pause() {
    if (mSensorMgr != null) {
        mSensorMgr.unregisterListener(this, SensorManager.SENSOR_ACCELEROMETER);
        mSensorMgr = null;
      }
  }

  @Override
  public void onAccuracyChanged(int sensor, int accuracy) {}

  @Override
  public void onSensorChanged(int sensor, float[] values)
  {
    if (sensor != SensorManager.SENSOR_ACCELEROMETER)
      return;
    
    long now = System.currentTimeMillis();

    if ((now - mLastForce) > SHAKE_TIMEOUT)
        mShakeCount = 0;

    if ((now - mLastTime) > TIME_THRESHOLD)
    {
      long diff = now - mLastTime;
    
      float speed = Math.abs(values[SensorManager.DATA_X] + values[SensorManager.DATA_Y] + values[SensorManager.DATA_Z] - mLastX - mLastY - mLastZ) / diff * 10000;
      
      if (speed > FORCE_THRESHOLD)
      {      
        if ((++mShakeCount >= SHAKE_COUNT) && (now - mLastShake > SHAKE_DURATION))
        {
          mLastShake = now;
          mShakeCount = 0;
          
          if (mShakeListener != null)
            mShakeListener.onShake(); 
        }
        
        mLastForce = now;
      }
      mLastTime = now;
      mLastX = values[SensorManager.DATA_X];
      mLastY = values[SensorManager.DATA_Y];
      mLastZ = values[SensorManager.DATA_Z];
    }

  }
}




Java Source Code List

com.rbonestell.androidshakelistener.MainActivity.java
com.rbonestell.androidshakelistener.ShakeListener.java