How to detect movement of an android device?

后端 未结 6 1495
日久生厌
日久生厌 2020-12-04 09:51

I need suggestion about how to detect the amount of movement of an android device. Suppose I have put the phone on a table or bed and then if somebody taps the table or sits

6条回答
  •  生来不讨喜
    2020-12-04 10:46

    This code is for walking detection (Modified from @anthropomo code)

    to get smoother value.

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

提交回复
热议问题