检测设备是在移动还是静止

3

我希望能够检测设备是在移动还是静止不动。我有这样一种情况,在设备静止不动时,我想要执行某些任务。

目前,我已经使用传感器实现了类似的功能,但当我将设备放在平面上(如桌子)移动时,无法检测到设备是否在移动。

@Override
    public void onSensorChanged(SensorEvent sensorEvent) {

        double alpha = 0.6;

        double[] gravity = new double[3];
        gravity[0] = 0;
        gravity[1] = 0;
        gravity[2] = 0;

        gravity[0] = alpha * gravity[0] + (1 - alpha) * sensorEvent.values[0];
        gravity[1] = alpha * gravity[1] + (1 - alpha) * sensorEvent.values[1];
        gravity[2] = alpha * gravity[2] + (1 - alpha) * sensorEvent.values[2];

        double[] linear_acceleration = new double[3];
        linear_acceleration[0] = sensorEvent.values[0] - gravity[0];
        linear_acceleration[1] = sensorEvent.values[1] - gravity[1];
        linear_acceleration[2] = sensorEvent.values[2] - gravity[2];

        float magnitude = 0.0f;
        magnitude = (float)Math.sqrt(linear_acceleration[0]*linear_acceleration[0]+linear_acceleration[1]*linear_acceleration[1]+linear_acceleration[2]*linear_acceleration[2]);
        magnitude = Math.abs(magnitude);
        Log.e("Magnitude",magnitude+"");
        if(magnitude>0.2){
            Log.e("walking","Yes");
        }else{
            Log.e("walking","No");
        }
    }

你是否正在使用加速度计? - krishank Tripathi
1
如果是的话,这可能会有用。https://dev59.com/NWUq5IYBdhLWcg3wV_Ei#14574992 - krishank Tripathi
1
使用Google的ActivityRecognitionApi来检查设备状态。 - Surender Kumar
只需注意,加速度计测量的是速度的变化,而不是运动本身。所以,如果你用手在桌子上移动某物,很有可能最初会有加速度,但在一个阈值内基本保持恒定速度,直到减速。 - user2711811
1个回答

2

如果您正在寻找一个例子,下面有一个。

这段代码是用于步行检测的

以获得更平滑的值。

// initialize
private SensorManager sensorMan;
private Sensor accelerometer;

private float[] mGravity;
private double mAccel;
private double mAccelCurrent;
private double mAccelLast;

private boolean sensorRegistered = false;
// onCreate

    sensorMan = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
    accelerometer = sensorMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mAccel = 0.00f;
    mAccelCurrent = SensorManager.GRAVITY_EARTH;
    mAccelLast = SensorManager.GRAVITY_EARTH;

    sensorMan.registerListener(this, accelerometer,
            SensorManager.SENSOR_DELAY_NORMAL);
    sensorRegistered = true;
// onSensorChanged

private int hitCount = 0;
private double hitSum = 0;
private double hitResult = 0;

private final int SAMPLE_SIZE = 50; // change this sample size as you want, higher is more precise but slow measure.
private final double THRESHOLD = 0.2; // change this threshold as you want, higher is more spike movement

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        mGravity = event.values.clone();
        // Shake detection
        double x = mGravity[0];
        double y = mGravity[1];
        double z = mGravity[2];
        mAccelLast = mAccelCurrent;
        mAccelCurrent = Math.sqrt(x * x + y * y + z * z);
        double delta = mAccelCurrent - mAccelLast;
        mAccel = mAccel * 0.9f + delta;

        if (hitCount <= SAMPLE_SIZE) {
            hitCount++;
            hitSum += Math.abs(mAccel);
        } else {
            hitResult = hitSum / SAMPLE_SIZE;

            Log.d(TAG, String.valueOf(hitResult));

            if (hitResult > THRESHOLD) {
                Log.d(TAG, "Walking");
            } else {
                Log.d(TAG, "Stop Walking");
            }

            hitCount = 0;
            hitSum = 0;
            hitResult = 0;
        }
    }
}

由于我只需要检测用户是否在行走,而不是计步数,所以这段代码非常有用。谢谢! - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接