2

I want to get accelerometer sensor data which is in earth axis through a service. I read about a way to do it as well on one of the posts on stackoverflow. But I have an issue.

@Override
public void onSensorChanged(SensorEvent event) {
    Toast.makeText(this, "Hollyy shiiitt",Toast.LENGTH_SHORT);
    String acceldata = "";

    float[] gravityValues = null;
    float[] magneticValues = null;

    if (event.sensor.getType() == Sensor.TYPE_GRAVITY) {
        gravityValues = event.values.clone();
        Toast.makeText(this, "The gra data is " + String.valueOf(gravityValues), Toast.LENGTH_SHORT);
    }

    if ((gravityValues != null) && (magneticValues != null)
            && (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)) {

        // float for use in conversion device relative acceleration to earth axis acceleration
        float[] deviceRelativeAcceleration = new float[4];
        deviceRelativeAcceleration[0] = event.values[0];
        deviceRelativeAcceleration[1] = event.values[1];
        deviceRelativeAcceleration[2] = event.values[2];
        deviceRelativeAcceleration[3] = 0;

        // Change the device relative acceleration values to earth relative values
        // X axis -> East
        // Y axis -> North Pole
        // Z axis -> Sky

        float[] R = new float[16], I = new float[16], earthAcc = new float[16];

        SensorManager.getRotationMatrix(R, I, gravityValues, magneticValues);

        float[] inv = new float[16];

        android.opengl.Matrix.invertM(inv, 0, R, 0);
        android.opengl.Matrix.multiplyMV(earthAcc, 0, inv, 0, deviceRelativeAcceleration, 0);

        acceldata = String.valueOf(lat) + "," + String.valueOf(lon) + "," +  String.valueOf(speed)+","+ String.valueOf(earthAcc[0]) + "," + String.valueOf(earthAcc[1]) + "," + String.valueOf(earthAcc[2])+ "," + String.valueOf(event.values[0])+ "," + String.valueOf(event.values[1])+ "," + String.valueOf(event.values[2]);

    }

    //SDK  version check
    if(Build.VERSION.SDK_INT > 18) {
        File file;
        FileWriter filew; // Internal Storage writing
        try {
            file = new File(getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS) + "/" + filename); //Android 4.4 and above
            filew = new FileWriter(file, true); //true for append
            filew.write(acceldata + String.valueOf(gravityValues) + String.valueOf(magneticValues) +      "\n");
            filew.close();


        } catch (Exception e) {
            e.printStackTrace();

        }
    }
    else{
        String data = acceldata + "\n"  ;
        try {
            FileOutputStream fOut = openFileOutput("/" + filename,Context.MODE_APPEND);
            fOut.write(data.getBytes());
            fOut.close();
            Toast.makeText(getBaseContext(),"file saved",Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(getBaseContext(),"file not saved API < 19",Toast.LENGTH_SHORT).show();
        }
    }

}

The if statement for gravity sensor on location changed doesn't return any value so the next statement also doesn't work as gravityValues has a null value.

The sensors registered are

mAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mMagnetsensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
mGravity = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);

They are then registered as

int SamplingFrequency = 2 * 100000; // delay in microsecond. in this case 0.2 second
sensorManager.registerListener(this, mAccelerometer,SamplingFrequency);
sensorManager.registerListener(this, mMagnetsensor, SamplingFrequency);
sensorManager.registerListener(this,mGravity,SamplingFrequency);

I am a newbie in app development so any help would be appreciated.

1 Answers1

1

Your device probably does not have gravity sensor. Check if it's available

if (mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null) {
        Toast.makeText(ActivitySensor1Availability.this, "Gravity AVAILABLE", Toast.LENGTH_SHORT).show();
    } else {
        // Failure! No Gravity Sensor.
        Toast.makeText(ActivitySensor1Availability.this, "Failure! No Gravity Sensor", Toast.LENGTH_SHORT).show();
    }
Thracian
  • 6,939
  • 2
  • 33
  • 64
  • Gravity AVAILIBLE toast appears on the screen when I try this code in my application. Any other suggestions? – Shaharyar Babar May 14 '17 at 06:23
  • Yes, without doing anything complex, check if you are getting values from gravity sensor `if (event.sensor.getType() == Sensor.TYPE_GRAVITY) { System.out.println("X: " + event.values[0]); System.out.println("Y: " + event.values[1]); System.out.println("Z: " + event.values[2]); }` – Thracian May 14 '17 at 07:36
  • Not sure, but when I added Linear_Acceleration sensor, then the gravity sensor started throwing up values as well. – Shaharyar Babar May 14 '17 at 08:37
  • How can you be not sure. If you use the snippet and get x,y, and z values then there is nothing wrong with it, the next step is the track where you omit the values. If you are a newbie, strip the code to the core and check each step. Create sensormanger, get gravity sensor from sensormanager, register it onResume and onSensorChanged check if you get the output from gravity sensor – Thracian May 14 '17 at 12:45