From 37cdda2751c1c74918f32c58bb2c5952d692cbcd Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Fri, 29 Aug 2014 10:31:51 +0200 Subject: fix #4255: crash on some Samsung devices when computing rotation matrix --- main/src/cgeo/geocaching/sensors/RotationProvider.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'main/src/cgeo/geocaching/sensors/RotationProvider.java') 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 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 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)); } -- cgit v1.1