public boolean detectShake(float x, float y, float z) {
   boolean isShaked = false;
   // シェイク時間のチェック
   long now = System.currentTimeMillis();
   if (mLastTime == 0) {
     mLastTime = now;
   }
   // SHAKE_TIMEOUT までに次の加速を検知しなかったら mShakeCount をリセット
   if (now - mLastAccel > SHAKE_TIMEOUT) {
     mShakeCount = 0;
   }
   // 速度を算出する
   long diff = now - mLastTime;
   float speed = Math.abs(x + y + z - mLastX - mLastY - mLastZ) / diff * 10000;
   LogUtils.d("speed: " + speed);
   if (speed > SPEED_THRESHOLD) {
     // mShakeCount の加算、SHAKE_COUNT を超えているかのチェック
     // 最後のシェイク時間から SHAKE_DURATION 経過しているかチェック
     if (++mShakeCount >= SHAKE_COUNT && now - mLastShake > SHAKE_DURATION) {
       mLastShake = now;
       mShakeCount = 0;
       isShaked = true;
     }
     // SPEED_THRESHOLD を超える速度を検出した時刻をセット
     mLastAccel = now;
   }
   mLastTime = now;
   mLastX = x;
   mLastY = y;
   mLastZ = z;
   return isShaked;
 }