I 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:47 am, Ethan Rublee <ethan.rub...@gmail.com> wrote:
> Here'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
> (Service.SENSOR_SERVICE);
> orientationSensor = sensorMgr.getDefaultSensor
> (Sensor.TYPE_ORIENTATION);
> magnetSensor = sensorMgr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
> accelSensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
>
> //this class implements SensorEventListener
> sensorMgr.registerListener(this,orientationSensor,
> SensorManager.SENSOR_DELAY_FASTEST);
> sensorMgr.registerListener(this,magnetSensor,
> SensorManager.SENSOR_DELAY_FASTEST);
> orientationsupported = sensorMgr.registerListener(this, accelSensor,
> SensorManager.SENSOR_DELAY_FASTEST);
>
> //*************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) {
>   case Sensor.TYPE_MAGNETIC_FIELD:
>
>     mags[0] = event.values[0];
>     mags[1] = event.values[1];
>     mags[2] = event.values[2];
>     break;
>   case Sensor.TYPE_ACCELEROMETER:
>     accels[0] = event.values[0];
>     accels[1] = event.values[1];
>     accels[2] = event.values[2];
>     break;
>   case Sensor.TYPE_ORIENTATION:
>     /******************************
>      *these are the orientation values in degrees - one of them is the
>      * magnetic heading....
>      */
>     // values = event.values.clone();
>
>     break;
>   }
>
>   //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.remapCoordinateSystem(RotationMatrix,
>       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 
> outhttp://developer.android.com/reference/android/hardware/SensorManager...
> for definitive documentation.
> I would put a text field in your activity and output the values live
> as the sensors update.  I have found that the numbers
> do not behave quite as expected, jumping 180 degrees depending on the
> tilt of the phone.  I have not tried getInclination,
> but documentation seems to point that this would be your best bet.
> Good luck.
>
> On Dec 12, 9:32 pm, Jeffrey <jeffisagen...@gmail.com> wrote:
>
>
>
> > 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?
>
> > On Dec 12, 8:13 pm, Jeffrey <jeffisagen...@gmail.com> wrote:
>
> > > 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?

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to