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