Search code examples
androidaccelerometer

Android Accelerometer Accumulation


I am getting the accelerometer values continuously (i.e) X and Y values in the run time. My question is that when the values of the accelerometer changes in mobile the corresponding values should be accumulated as per the change.

This is my code :

public class MainActivity extends Activity implements SensorEventListener {
    private SensorManager sensorManager;

    private float accumulation_x = 0;
    private float accumulation_y = 0;
    private float accumulation_z = 0;

    private TextView acessTextview, angleTextview;
    private float value;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById();

        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_NORMAL);

    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    public void onSensorChanged(SensorEvent event) {

        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {





            int count = 1;
                    while(count!=0){

                        float x = (float) 0.9887777;
                        float y = (float) 0.187359372; 
                        float z = (float) 0.0228636;

                float X_axis = (float) (x + (0.02724095));
                float Y_axis = (float) (y + (-0.027792556));
                float Z_axis = (float) (z - (0.105689));

                accumulation_x = accumulation_x + X_axis;
                accumulation_y = accumulation_y + Y_axis;
                accumulation_z = accumulation_z + Z_axis;

                value = (y / z);
                float angle = (float) Math.toDegrees(Math.atan(value));
                angleTextview.setText("Angle:" + angle);

                acessTextview.setText("accumulation_x  :" + X_axis + "\n"
                        + "accumulation_y :" + Y_axis + "\n"
                        + "accumulation_z  :" + Z_axis);

                count++;

                    }

        }

    }

    private void findViewById() {
        // TODO Auto-generated method stub
        acessTextview = (TextView) findViewById(R.id.accessTextview);
        angleTextview = (TextView) findViewById(R.id.angleTextview);
    }

}

Solution

  • Your code is correct, only minor changes are require, I have updated your code with an extra method called refreshValues(). This method will set the latest values of X,Y in to TextView. This method will get called from onSensorChanged() method.

    public class MainActivity extends Activity implements SensorEventListener {
        private SensorManager sensorManager;
    
        private float accumulation_x = 0;
        private float accumulation_y = 0;
        private float accumulation_z = 0;
    
        private TextView acessTextview, angleTextview;
        private float value;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            findViewById();
    
            sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            sensorManager.registerListener(this,
                    sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
    
        }
    
        public void onAccuracyChanged(Sensor sensor, int accuracy) {   }
    
        public void onSensorChanged(SensorEvent event) {
    
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    
                int count = 1;
                        while(count!=0){
    
                            float x = (float) 0.9887777;
                            float y = (float) 0.187359372; 
                            float z = (float) 0.0228636;
    
                    float X_axis = (float) (x + (0.02724095));
                    float Y_axis = (float) (y + (-0.027792556));
                    float Z_axis = (float) (z - (0.105689));
    
                    accumulation_x = accumulation_x + X_axis;
                    accumulation_y = accumulation_y + Y_axis;
                    accumulation_z = accumulation_z + Z_axis;
    
                    value = (y / z);
                    float angle = (float) Math.toDegrees(Math.atan(value));
                    angleTextview.setText("Angle:" + angle);
    
                    acessTextview.setText("accumulation_x  :" + X_axis + "\n"
                            + "accumulation_y :" + Y_axis + "\n"
                            + "accumulation_z  :" + Z_axis);
    
                    count++;
    
                        }
    
            }
    
            refreshValues ( accumulation_x,accumulation_y );
        }
    
        private void findViewById() {
            // TODO Auto-generated method stub
            acessTextview = (TextView) findViewById(R.id.accessTextview);
            angleTextview = (TextView) findViewById(R.id.angleTextview);
        }
    
        private void refreshValues ( float x, float y )
        {
            acessTextview.setText ( String.valueOf(x) );
            angleTextview.setText( ( String.valueOf(y)));
        }
    
    }