Question

I have been working on logging data from accelerometer. Nonetheless, I find it difficult to control the on/off of the accelerometer sensor. I have tried to have two buttons, one called Start and the other Stop. I initialized my senor object in the onCreate() callback of the Activity Class. Then in the onClick() callback for the buttons, I checked the id of the View, if it's Start button, I registerListen for the sensor, if it's stop, I unregister it. This does not work as expected. And onSensorChanged(), I simply display the x,y, z accelerations. The sensor does what it needs to do no matter what buttons I clicked on, and even without clicking on any of the buttons. It seems to be that once the sensor is initialized, it keeps reading and there is no way to stop it. Is it possible to control the on/off of the sensor using two buttons?

Thanks

Update:

package com.example.firstapp;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener,OnClickListener {
private float mLastX, mLastY, mLastZ;
private boolean mInitialized;

private SensorManager mSensorManager;

private Sensor mAccelerometer;

private final float NOISE = (float) 2.0;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startButton = (Button) findViewById(R.id.start);
Button stopButton = (Button) findViewById(R.id.start);
startButton.setOnClickListener(this);
stopButton.setOnClickListener(this);
mInitialized = false;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// can be safely ignored for this demo
}
@Override
public void onSensorChanged(SensorEvent event) {
TextView tvX= (TextView)findViewById(R.id.x_axis);
TextView tvY= (TextView)findViewById(R.id.y_axis);
TextView tvZ= (TextView)findViewById(R.id.z_axis);
ImageView iv = (ImageView)findViewById(R.id.image);
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
if (!mInitialized) {
mLastX = x;
mLastY = y;
mLastZ = z;
tvX.setText("0.0");
tvY.setText("0.0");
tvZ.setText("0.0");
mInitialized = true;
} else {
float deltaX = Math.abs(mLastX - x);
float deltaY = Math.abs(mLastY - y);
float deltaZ = Math.abs(mLastZ - z);
if (deltaX < NOISE) deltaX = (float)0.0;
if (deltaY < NOISE) deltaY = (float)0.0;
if (deltaZ < NOISE) deltaZ = (float)0.0;
mLastX = x;
mLastY = y;
mLastZ = z;
tvX.setText(Float.toString(deltaX));
tvY.setText(Float.toString(deltaY));
tvZ.setText(Float.toString(deltaZ));
iv.setVisibility(View.VISIBLE);
//if (deltaX > deltaY) {
//iv.setImageResource(R.drawable.horizontal);
//} else if (deltaY > deltaX) {
//iv.setImageResource(R.drawable.vertical);
//} else {
//iv.setVisibility(View.INVISIBLE);
//}
}
}
@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()){
        case R.id.start:
            mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
            break;
        case R.id.stop:
            mSensorManager.unregisterListener(this,mAccelerometer);
            break;
    }

}
}
Was it helpful?

Solution

just update the unregisterListener.

  case R.id.stop:
    //          mSensorManager.unregisterListener(this,mAccelerometer);
                mSensorManager.unregisterListener(this);
                break;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top