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

Reply via email to