As a temporary fix you could just copy-paste the original source code from 
the Android SDK as a drop-in replacement:

    public static void getRotationMatrixFromVector(float[] R, float[] 
> rotationVector) {
>
>         float q0;
>         float q1 = rotationVector[0];
>         float q2 = rotationVector[1];
>         float q3 = rotationVector[2];
>
>         if (rotationVector.length == 4) {
>             q0 = rotationVector[3];
>         } else {
>             q0 = 1 - q1*q1 - q2*q2 - q3*q3;
>             q0 = (q0 > 0) ? (float)Math.sqrt(q0) : 0;
>         }
>
>         float sq_q1 = 2 * q1 * q1;
>         float sq_q2 = 2 * q2 * q2;
>         float sq_q3 = 2 * q3 * q3;
>         float q1_q2 = 2 * q1 * q2;
>         float q3_q0 = 2 * q3 * q0;
>         float q1_q3 = 2 * q1 * q3;
>         float q2_q0 = 2 * q2 * q0;
>         float q2_q3 = 2 * q2 * q3;
>         float q1_q0 = 2 * q1 * q0;
>
>         if(R.length == 9) {
>             R[0] = 1 - sq_q2 - sq_q3;
>             R[1] = q1_q2 - q3_q0;
>             R[2] = q1_q3 + q2_q0;
>
>             R[3] = q1_q2 + q3_q0;
>             R[4] = 1 - sq_q1 - sq_q3;
>             R[5] = q2_q3 - q1_q0;
>
>             R[6] = q1_q3 - q2_q0;
>             R[7] = q2_q3 + q1_q0;
>             R[8] = 1 - sq_q1 - sq_q2;
>         } else if (R.length == 16) {
>             R[0] = 1 - sq_q2 - sq_q3;
>             R[1] = q1_q2 - q3_q0;
>             R[2] = q1_q3 + q2_q0;
>             R[3] = 0.0f;
>
>             R[4] = q1_q2 + q3_q0;
>             R[5] = 1 - sq_q1 - sq_q3;
>             R[6] = q2_q3 - q1_q0;
>             R[7] = 0.0f;
>
>             R[8] = q1_q3 - q2_q0;
>             R[9] = q2_q3 + q1_q0;
>             R[10] = 1 - sq_q1 - sq_q2;
>             R[11] = 0.0f;
>
>             R[12] = R[13] = R[14] = 0.0f;
>             R[15] = 1.0f;
>         }
>     }
>

Interestingly enough the original code does not explicitly throw the 
exception you mentioned. So it must be some weird Samsung hack. You could 
try registering with Samsung as a developer and use their support ticket 
system in order to tell them about this problem. However, I already 
complained once about one of their SDKs and never heard back from them.

On Wednesday, October 2, 2013 8:41:01 AM UTC-5, String wrote:
>
> I've been getting error reports from users of the Note 3 that boil down to 
> the following:
>
>
>  *java.lang.IllegalArgumentException: R array length must be 3 or 4*
>
> *at 
> android.hardware.SensorManager.getRotationMatrixFromVector(SensorManager.java:1336)
> *
>
>
>  This function, *getRotationMatrixFromVector()*, is documented as a 
> "Helper function to convert a rotation vector to a rotation matrix. Given a 
> rotation vector (presumably from a ROTATION_VECTOR sensor)". My typical 
> call to this function looks like this:
>
>
>  *SensorManager.getRotationMatrixFromVector(R, rotationVector);*
>
>
>  Where the *rotationVector *comes from the hardware accelerometer and 
> gyroscope, and (despite the error message about *R*) it's with this 
> parameter where the problem lies. It's directly passed from 
> *android.hardware.SensorEventListener.onSensorChanged(SensorEvent 
> event)* for a *Sensor.TYPE_ROTATION_VECTOR* event. The *event *parameter 
> there has a *values *property that is passed as the *rotationVector *in 
> the previous call. And according to the docs at
>
> http://developer.android.com/reference/android/hardware/SensorEvent.html#values,
>  
> this array can legitimately have up to 5 elements - moreover, in Android 
> 4.3, it *should *have all 5. However, passing an array of length 5 causes 
> the Note 3 to crash on the aforementioned *IllegalArgumentException*; it 
> seems to expect 4 elements at most.
>
>
>  So, here's the summary: Android 4.3 passes an array with 5 elements to 
> this hardware event, and the Note 3 throws an exception when passed that 
> same array to the system-defined helper function for that event. This 
> behavior does not happen on the other 4.3 devices I have at hand (Galaxy 
> Nexus and Nexus 7); it appears to be a basic flaw in the Samsung 
> implementation of 4.3.
>
>
>  And I know, this all looks like minutiae of a hyper-specific issue - but 
> believe me, it's likely to be encountered by any app using the device's 
> motion sensors. A Google search for *getRotationMatrixFromVector *returns 
> 51,400 results.
>
> Any comment from Samsung on this would be most welcome, if unlikely.
>
>
> String
>
>
>

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to