I am doing a project which is detecting the direction of moving by using accelerometer However, the 3 axis of accelerometer will not always follow the world xyz plane as we tilt or rotate our phone. I was trying to fix it by getting the pitch and roll from the phone and convert the axis of the phone to the world xyz axis. But now my pitch and roll always get 0. Can anyone help me ? or is there any other way to solve my problem? Thanks for the help!
package com.example.suntracking;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
public class AxisCheck extends Activity implements SensorEventListener{
Sensor accelerometer,magnetometer;
float[] lastAccelerometer = new float[3];
float[] lastMagnetometer = new float[3];
boolean lastAccelerometerSet = false;
boolean lastMagnetometerSet = false;
SensorManager sm;
float pval,rval;
float[] mR = new float[9];
float[] mhold= new float[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
initialize();
accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
magnetometer = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
finish();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
sm.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
sm.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
private void initialize() {
// TODO Auto-generated method stub
sm =(SensorManager)getSystemService(SENSOR_SERVICE);
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor == accelerometer) {
System.arraycopy(event.values, 0, lastAccelerometer, 0, event.values.length);
lastAccelerometerSet = true;
} else if (event.sensor == magnetometer) {
System.arraycopy(event.values, 0, lastMagnetometer, 0, event.values.length);
lastMagnetometerSet = true;
}
if (lastAccelerometerSet && lastMagnetometerSet) {
SensorManager.getRotationMatrix(mR, null, lastAccelerometer, lastMagnetometer);
SensorManager.getOrientation(mR,mhold);
pval = Math.round(mhold[1]);
rval = Math.round(mhold[2]);
savePreferences();
}
}
private void savePreferences() {
// TODO Auto-generated method stub
SharedPreferences savedata = getSharedPreferences("savealldata",0);
Editor editor=savedata.edit();
editor.putFloat("pval", pval);
editor.putFloat("rval", rval);
editor.commit();
}
}