aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/sensors/RotationProvider.java
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-08-29 10:31:51 +0200
committerSamuel Tardieu <sam@rfc1149.net>2014-08-29 10:31:51 +0200
commit37cdda2751c1c74918f32c58bb2c5952d692cbcd (patch)
tree640a0cca8c55181fa69a70e7694edf7d857efb62 /main/src/cgeo/geocaching/sensors/RotationProvider.java
parenta7b49faf986501b6d70841f7d33981bf97a7e706 (diff)
downloadcgeo-37cdda2751c1c74918f32c58bb2c5952d692cbcd.zip
cgeo-37cdda2751c1c74918f32c58bb2c5952d692cbcd.tar.gz
cgeo-37cdda2751c1c74918f32c58bb2c5952d692cbcd.tar.bz2
fix #4255: crash on some Samsung devices when computing rotation matrix
Diffstat (limited to 'main/src/cgeo/geocaching/sensors/RotationProvider.java')
-rw-r--r--main/src/cgeo/geocaching/sensors/RotationProvider.java11
1 files changed, 10 insertions, 1 deletions
diff --git a/main/src/cgeo/geocaching/sensors/RotationProvider.java b/main/src/cgeo/geocaching/sensors/RotationProvider.java
index a7c5cf0..40e2c3c 100644
--- a/main/src/cgeo/geocaching/sensors/RotationProvider.java
+++ b/main/src/cgeo/geocaching/sensors/RotationProvider.java
@@ -18,6 +18,7 @@ public class RotationProvider extends LooperCallbacks<Float> implements SensorEv
private final Sensor rotationSensor;
private final float[] rotationMatrix = new float[16];
private final float[] orientation = new float[4];
+ private final float[] values = new float[4];
@TargetApi(19)
protected RotationProvider(final Context context, final boolean lowPower) {
@@ -40,7 +41,15 @@ public class RotationProvider extends LooperCallbacks<Float> implements SensorEv
@Override
public void onSensorChanged(final SensorEvent event) {
- SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values);
+ // On some Samsung devices, SensorManager#getRotationMatrixFromVector throws an exception if the rotation
+ // vector has more than 4 elements. Since only the four first elements are used, we can truncate the vector
+ // without losing precision.
+ if (event.values.length > 4) {
+ System.arraycopy(event.values, 0, values, 0, 4);
+ SensorManager.getRotationMatrixFromVector(rotationMatrix, values);
+ } else {
+ SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values);
+ }
SensorManager.getOrientation(rotationMatrix, orientation);
subscriber.onNext((float) (orientation[0] * 180 / Math.PI));
}