如何在Android应用程序中计算手机的振动

时间:2011-04-29 05:12:12

标签: android vibration

在我的应用程序中,当用户走路时,我想计算手机的震动(振动)。如何计算手机的抖动以及如何显示其输出。

1 个答案:

答案 0 :(得分:1)

这是让手机在震动时振动的代码....

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];
        }
      }
}

我们必须在清单文件中添加以下行

 <uses-permission android:name="android.permission.SHAKE" />
    <uses-permission android:name="android.permission.VIBRATE" />