Getting magnetic field results as degrees

by Jeffrey » Sun, 13 Dec 2009 10:13:53 GMT

Sponsored Links
 I'm working on an application that will randomly point an arrow in a
direction, and have that arrow maintain it's direction if the device
is moved. All I want to do it get the magnetic field readings as
degrees and I can do it from there. The problem I'm having is getting
the magnetic field readings. I can't find any tutorials on it and the
API demo on google's dev site uses deprecated code (figures, google's
sample code is never n00b friendly).

At this point I've got this together but I don't know what I'm
missing, all the examples I can find are using SensorListener which
has onSensorChanged(int sensor, float[] values) but
SensorEventListener does not support "float[] values"

What am I missing here?


Getting magnetic field results as degrees

by Jeffrey » Sun, 13 Dec 2009 10:32:14 GMT

 Okay, so I got a little further, I'm now stuck at the point where I
can pull values, but they are the micro-tesla measurements. How do I
get degrees from this?


Sponsored Links

Getting magnetic field results as degrees

by Peli » Sun, 13 Dec 2009 21:08:26 GMT

 You need basic trigonometry: 

if x and y denote the magnetic field strength in microtesla, then you
get the angle through the arc tangent function:
phi = Math.atan(y/x);
or phi = Math.atan2(y,x);
phi is then the angle in radians. Note that you may want to convert
phi from radians to degree (using phideg = Math.toDegree(phi);)

Note that this only works if your phone lies flat on the desk. In
arbitrary orientation, you need more sophisticated conversion that
includes x, y, and z and the accelerometer values.



Getting magnetic field results as degrees

by Jeffrey » Mon, 14 Dec 2009 04:43:32 GMT

 THANK YOU! I could NOT find any info on this anywhere! You have just
made me very happy!


Getting magnetic field results as degrees

by Ethan Rublee » Mon, 14 Dec 2009 05:34:25 GMT

 ere's my code for capturing orientation data... This is a snippet so
has not been compiled, but should give you and idea.
Keep in mind that you should register the sensors with something like
this when ever you want to start listening to sensors:

sensorMgr = (SensorManager) contex.getSystemService
orientationSensor = sensorMgr.getDefaultSensor
magnetSensor = sensorMgr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
accelSensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

//this class implements SensorEventListener
orientationsupported = sensorMgr.registerListener(this, accelSensor,

//*************The following is the static data necessary for my
sensorlistener, these are fields of my class
// for storing sensor data
float[] mags = new float[3];
float[] accels = new float[3];

int matrix_size = 16;
// matrices for letting SensorManager do its magic
float[] RotationMatrix = new float[matrix_size];
float[] InclinationMatrix = new float[matrix_size];

// an output matrix, that will hold a rotation matrix that
// can be used in openGl as a modelview matrix
float[] outR = new float[matrix_size];

// the orientation rotation array
float[] values = new float[3];

// here's the meat of the sensor handling, from the
android.hardware.SensorListener interface
public void onSensorChanged(SensorEvent event) {
Sensor sensor = event.sensor;

int type = sensor.getType();

switch (type) {

mags[0] = event.values[0];
mags[1] = event.values[1];
mags[2] = event.values[2];
accels[0] = event.values[0];
accels[1] = event.values[1];
accels[2] = event.values[2];
*these are the orientation values in degrees - one of them is the
* magnetic heading....
// values = event.values.clone();


//this is key to getting your heading, it fills out the matrices
which are needed to calculate the
//heading. It is important to not that the acceleration data is
linked to the magnetic data, in that the
//physical tilt/yaw of the phone affects the mags vector. Atleast
this is my understanding.
SensorManager.getRotationMatrix(RotationMatrix, InclinationMatrix,
accels, mags);

// this is only necessary for my AR opengl purposes
SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, outR);

// This is the orientation that i need
// values[0] = compass in radians
// values[1] and values[2] are the rotations about the x and y axis
SensorManager.getOrientation(outR, values);

// I have not used this function but it may give you the magnetic
// heading
// directly, in radians of course
float magHeading = SensorManager.getInclination(InclinationMatrix);


Check out
for definitive documentation.
I would put a text field in your activity and output the values live
as the sensors

Getting magnetic field results as degrees

by Jeffrey » Tue, 15 Dec 2009 08:39:50 GMT

  got it working, the phone will only need to be lying flat, so that
made it a lot easier. It seems like google should mention somewhere
that you need to use trig to get degree's from the compass... That
doesn't quite seem like general knowledge. Though I had a problem with
the activity force closing occasionally but I fixed that so that it
wouldn't try and take sensor readings until the activity had been open
for 1 second. It also adds to the suspense of what direction the drift
will be :)

On Dec 13, 12:47am, Ethan Rublee <> wrote:


Other Threads

1. AccountManager - confirmCredentials

Anyone with experience with this API? I did some searching through the
google code docs, and code search with not much luck for what I'm
looking to do. I want to provide an alternate authentication mechanism
for my app in case the user forgets the password they set using one of
the registered gmail addresses as follows:

AccountManager actMgr =
Account[] accounts = actMgr.getAccountsByType("");

Account userAcct = null;
Bundle result = null;

for (Account act : accounts)
 if (txt.getText().toString().equals(
  userAcct = act;

if (null != userAcct)
  // submit off the account to verify the credentials
  AccountManagerFuture<Bundle> bundle =
                                                               null, // what 
should go here for

  result = bundle.getResult();
 catch (Exception e)
  Log.d(s_Namespace, "Failed to submit credentials!");

According to the docs the returned bundle should contain either a
contains nothing and there is no error from the logcat. Any help would
be appreciated, and if anyone has suggestions for alternate ways to
authenticate that would be great.

I'm trying to avoid at all cost taking in the user's password,
otherwise I could just submit that as an option, as I dont want to add
onto the plague of "un" trusted 3rd party apps.


2. what happens to the auto generated linux user ids when apk files are installed and uninstalled?

I read that each apk file runs in its own process (unless shared) and
gets its own unique user id.

I take it this user id is auto generated unless one indicates a
specific shared id.

what is the format of these user ids?

what happens to them when apk files are uninstalled and removed from the system?

are these recycled or just incremented every time.



3. Themes untuk samdroid 1.0.2

4. Finally More Users on Android 2.1 but Android Still Fragmented [Chart]

5. Spica udah diroot, pengen diinstal live wallpaper & wifi tethering

6. Finally More Users on Android 2.1 but Android Still Fragmented [Chart]

7. Does the use of a remote service help avoiding GC lags?