Search code examples
javaandroidclassaccelerometer

Android Accelerometer Reading


I want to use multiple classes to display Accelerometer readings. I have tried to get the accelerometer readings in a single class and it runs perfectly fine. But in this code the output is 0.00000 , 0.000000 , 0.00000

Here are my two classes:

package com.example.sample;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;
import android.content.Context;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    AccData accl=new AccData();     

    accl.mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    accl.sensor = accl.mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    accl.register();
    String result=accl.getAccelerometerReading();
    TextView display=(TextView)findViewById(R.id.tv);
    display.setText(result);

}
}

2.

package com.example.sample;


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

public class AccData extends Activity implements SensorEventListener {


public float acclX,acclY,acclZ;
public SensorManager mSensorManager;
public Sensor sensor;


@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    acclX = event.values[0];
    acclY =event.values[1];
    acclZ = event.values[2];
    }

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

}


public void register() {
    // TODO Auto-generated method stub
    mSensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_NORMAL);
}
protected void unregister() {
    mSensorManager.unregisterListener(this, sensor);
}
protected String getAccelerometerReading()
{
    return String.format("%7f" + ", %7f"+ ", %7f" ,acclX,acclY,acclZ);  
}
}

Solution

  • You need a mechanism to inform other classes that AccData has updated values available. Typically, this is done by a listener - you already made use of this concept by this code line:

    public class AccData extends Activity implements SensorEventListener
    

    Your class AccData gets informed when there was a new SensorEvent. More information on how to write listeners can be found at this Java tutorials page

    To give you a basic idea:

    • Create an interface for the listener, e.g.

      public interface MyListener{
        public void processSensorEvent(SensorEvent event);
      }
      
    • Add registerListener/ unregisterListener methods to the class AccData. Add also a data structure to store the registered listeners.
    • Write a method fireUpdate in AccData that is called from within onSensorChanged and takes the new SensorEvent as argument.

      @Override
      public void onSensorChanged(SensorEvent event) {
        acclX = event.values[0];
        acclY =event.values[1];
        acclZ = event.values[2];
        fireUpdate(event);
      

      }

    • The purpose of fireUpdate is to iterate over the list of registered listeners and call their implementation of the method processSensorEvent(SensorEvent event)

      private void fireUpdate(SensorEvent event){
        for (MyListener listener: MyListeners){
          listener.processSensorEvent(event);
        }
      }
      
    • Let your main activity implement MyListener.

      public class MainActivity extends Activity implements MyListener{
      
    • Then you will have to implement the method processSensorEvent(SensorEvent event) in the main activity and can use it to update the textview.

      public void processSensorEvent(SensorEvent event){
        TextView display=(TextView)findViewById(R.id.tv);
        display.setText(event.values[0] + " " + event.values[1] + " " + event.values[2]);
      }