PaulJNewell
PaulJNewell

Reputation: 249

How to use Android sensor event to determine if device is facing up or down

I have quite a simple requirement. Assuming a device is standing on its end, perpendicular to the ground, and it is tilted, all I need to determine is whether the phone is tilted forward or back (screen more toward the ground or more toward the ceiling).

I know how to read values from the various sensors and I figure that using sensor TYPE_ROTATION_VECTOR is the way forward. All I'm missing is the maths know-how to determine forward or back from the three values it returns.

I've read all related threads on SO without enlightenment, any help very much appreciated.

Upvotes: 6

Views: 6537

Answers (3)

Gurinder Singh
Gurinder Singh

Reputation: 857

You can use the accelerometer and the magnetic field sensor to detect this.

I've found this helpful blog post which has the necessary code to show you how to do this.

http://www.ahotbrew.com/how-to-detect-forward-and-backward-tilt/

Upvotes: -1

Hoan Nguyen
Hoan Nguyen

Reputation: 18151

float[] rotationMatrix = new float[9];
float[] inclinationMatrix = new float[9];
float[] accelerometer; // values from sensor
float[] magnetic; // values from sensor
SensorManager.getRotationMatrix(rotationMatrix, inclinationMatrix, accelerometer, magnetic) 
int inclination = (int) Math.round(Math.toDegrees(Math.acos(rotationMatrix[8])));

if (inclination < 90)
{
      // face up
}

if (inclination > 90)
{
       // face down
}

Upvotes: 3

Ajit
Ajit

Reputation: 967

The X axis is horizontal and points to the right, the Y axis is vertical and points up and the Z axis points towards the outside of the front face of the screen. In this system, coordinates behind the screen have negative Z values.

The reference coordinate system is defined as a direct orthonormal basis, where:

X is defined as the vector product Y.Z (It is tangential to the ground at the device's current location and roughly points East).
Y is tangential to the ground at the device's current location and points towards magnetic north.
Z points towards the sky and is perpendicular to the ground.

In your case try this,

if(Round(y,4) < 8.0){
           Log.d("sensor", "=====UP====");


        }

        else if(Round(y,4) < -8.0){
            Log.d("sensor", "=====DOWN====");

        }

accelerometer sensor

Upvotes: 1

Related Questions