excellent! - it was the event accuracy check that was screwing things up! Once I removed the check it worked ok, although the compass was a bit ropey (so maybe the sensor really wasn't accurate, but at least I get some semblance of a value).
Many thanks, that's a big relief to have sorted that out. Nik On Tuesday, July 10, 2012 9:26:54 PM UTC+1, Adam Ratana wrote: > > Just a quick $.02: > 1. On some phones it is possible that sensor accuracy may be unreliable > always and never change - not likely, but possible, I've seen that with at > least one of the sensors, where the reported accuracy never changed - so be > sure that's not nerfing your code there, that check you have for > event.accuracy. > > 2. I like the deprecated orientation sensor, I'm probably in the minority > though. > > 3. most implementations I've seen copy the event.values since the array > you get back is re-used, and you may be waiting for 2 events before you > fuse the values, but that's probably not a problem if it's working for you > on many phones > > On Tuesday, July 10, 2012 6:39:32 AM UTC-4, Nik Cain wrote: >> >> Hi, >> >> My app relies heavily on having a compass bearing (it's an open source >> app at https://github.com/ShowMeHills/ShowMeHills). Most of the devices >> work ok, but on one of my devices I don't get any events from the magnetic >> field sensor. >> >> The device is an Xperia Arc (Lt15i), Android 2.3.4. Quite possibly the >> sensor is broken as after googling I've found no-one else seeing the >> problem. So I didn't worry about it too much initially. >> >> However I'm seeing users of other phones reporting that the app doesn't >> work while other compass apps do, which obviously makes my app look >> terrible (an HTC esspresso phone apparently). I'm assuming either the other >> apps are falling back to using the deprecated Orientation sensor, or I've >> missed something subtle which most phones are not worrying about (but some >> do). >> >> As far as I know I don't think I'm doing anything wrong - my main >> activity class sets up the listener with; >> >> mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); >> >> accelerometer = >> mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); >> magnetometer = >> mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); >> >> mSensorManager.registerListener(this, accelerometer, >> SensorManager.SENSOR_DELAY_GAME); >> mSensorManager.registerListener(this, magnetometer, >> SensorManager.SENSOR_DELAY_GAME); >> >> (unregistering and reregistering in pause/resume), then has the listener >> which is like; >> >> public void onSensorChanged(SensorEvent event) { >> if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) { >> return; >> } >> >> if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) >> mGravity = event.values; >> if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) >> mGeomagnetic = event.values; >> >> if (mGravity != null && mGeomagnetic != null) { >> >> float[] rotationMatrixA = mRotationMatrixA; >> if (SensorManager.getRotationMatrix(rotationMatrixA, null, >> mGravity, mGeomagnetic)) { >> >> do my compass bearing calculation... >> } >> >> >> The problem is that I never get a magnetic field event (only >> accelerometer events), so never get to do my bearing calculation. I assume >> I can't do SensorManager.getRotationMatrix without BOTH of those values? >> Otherwise I think that's all normal stuff. >> >> However, the phone's TYPE_ORIENTATION events do work. The trouble is I'm >> confused as to how to transform the coordinates so that I get a compass >> bearing in the direction of the camera (ie handset isn't flat, it's held up >> while looking at the view - landscape mode). I've managed this with the >> accelerator/magnetic matrices, but then there were lots of help online for >> that - I've not found any examples of transposing the orientation matrix. >> Plus it's deprecated, so I doubt it's the smart thing to fall back to. >> >> So has anyone any ideas why some phones don't fire magnetic sensor events >> (which is broken - my code or my phone)? Or failing that a snippet of code >> to orient; >> >> if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) >> { >> float azimuth_angle = event.values[0]; >> float pitch_angle = event.values[1]; >> float roll_angle = event.values[2]; >> ..bearing = ? >> >> into a compass bearing when the handset is orientated as >> Surface.ROTATION_90 (landscape, camera facing away from you looking at the >> view). >> >> Thanks, >> Nik >> > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

