开发者

Shake Listener detects orientation changes

开发者 https://www.devze.com 2023-02-09 19:53 出处:网络
I\'m trying to detect shake events in my application so that I would be able to do something when user shakes the device. But the problem is; ShakeListener which I used, detects orientation changes as

I'm trying to detect shake events in my application so that I would be able to do something when user shakes the device. But the problem is; ShakeListener which I used, detects orientation changes as a shake event.(When I move the phone from landscape to portrait, it detects a shake)

I tried changing the force threshold but at that time it can't detect any shake event.

Here is the ShakeListener code which i took from this site :

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class ShakeListener implements SensorEventListener {
private static final int FORCE_THRESHOLD = 500;
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;
}

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

public void resume(OnShakeListener listener) {
    this.setOnShakeListener(listener);
    mSensorMgr = (SensorManager) mContext
            .getSystemService(Context.SENSOR_SERVICE);
    if (mSensorMgr == null) {
        throw new UnsupportedOperationException("Sensors not supported");
    }

    boolean supported = mSensorMgr.registerListener(this,
            mSensorMgr.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_UI);

    if (!supported) {
        mSensorMgr.unregisterListener(this,
                mSensorMgr.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER));
        throw new UnsupportedOperationException(
                "Accelerometer not supported");
    }
}

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

public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub

}

public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() != 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(event.values[SensorManager.DATA_X]
                + event.values[SensorManager.DATA_Y]
                + event.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 = event.values[SensorManager.DATA_X];
        mLastY = event.values[SensorManager.DATA_Y];
        mLastZ = event.values[Sen开发者_运维技巧sorManager.DATA_Z];
    }

}
}

I want to detect only shake movements, not orientation changes.

Any suggestion?


You will probably have to unregister your sensor listener followed by zeroing/nulling/reinitializing the values you use to determine a "shake event." Then re-register your listener.

An orienatation change triggers onDestroy followed by onCreate.

0

精彩评论

暂无评论...
验证码 换一张
取 消