Pergunta

in my app when the user walks i want to calculate the shaking(vibration) of a mobile. How to calculate the shaking of a mobile and how to show its output.

Foi útil?

Solução

here is the code for making a mobile to get vibrated when is shaked....

final Vibrator vibe = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);        
 mShaker = new ShakeListener(this);        
 mShaker.setOnShakeListener(new ShakeListener.OnShakeListener () 
 {
   public void onShake()
   {
      vibe.vibrate(100);
      System.out.println("SHAKE LISTENER CALLED");
      noofShakes++;
   }
  });



 public class ShakeListener implements SensorEventListener
{
      private static final int FORCE_THRESHOLD = 300;
      private static final int TIME_THRESHOLD = 100;
      private static final int SHAKE_TIMEOUT = 500;
      private static final int SHAKE_DURATION = 1000;
      private static final int SHAKE_COUNT = 3;

      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 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) 
        {
          throw new UnsupportedOperationException("Sensors not supported");
        }

        boolean supported = false;

        try 
        {
            supported = mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
        } 
        catch (Exception e) 
        {
            Toast.makeText(mContext, "Shaking not supported", Toast.LENGTH_LONG).show();
        }

        if ((!supported)&&(mSensorMgr != null)) mSensorMgr.unregisterListener(this);
      }

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

      public void onAccuracyChanged(Sensor sensor, int accuracy) 
      {

      }

      public void onSensorChanged(SensorEvent event)
      {
        if (event.sensor.getType() != Sensor.TYPE_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(event.values[SensorManager.DATA_X] + event.values[SensorManager.DATA_Y] + event.values[SensorManager.DATA_Z] - mLastX - mLastY - mLastZ) / diff * 10000;
          System.out.println("SPEED OF THE VIBRATION "+speed);
          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 = event.values[SensorManager.DATA_X];
          mLastY = event.values[SensorManager.DATA_Y];
          mLastZ = event.values[SensorManager.DATA_Z];
        }
      }
}

we have to add the following line in the manifest file

 <uses-permission android:name="android.permission.SHAKE" />
    <uses-permission android:name="android.permission.VIBRATE" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top