2010-07-07 12 views
5

Necesito recuperar la orientación de mi teléfono. En el momento de escribir este:Android - SensorManager comportamiento extraño de getOrientation

public void onSensorChanged(SensorEvent event) { 
    switch (event.sensor.getType()){ 
    case Sensor.TYPE_MAGNETIC_FIELD: 
    this.mag_vals = event.values.clone(); 
    this.sensorReady = true; 
    break; 
    case Sensor.TYPE_ACCELEROMETER: 
    this.acc_vals = event.values.clone(); 
    break; 
    } 
    if (this.mag_vals != null && this.acc_vals != null && this.sensorReady) { 
    this.sensorReady = false; 
    float[] R = new float[ProjectConstants.SIZE_MATRIX]; 
    float[] I = new float[ProjectConstants.SIZE_MATRIX]; 
    SensorManager.getRotationMatrix(R, I, this.acc_vals, this.mag_vals); 

    SensorManager.getOrientation(R, this.actual_orientation); 
    ... 

Este código permite que consiga la orientación del teléfono si dejo el teléfono en una superficie plana y girarlo sobre la superficie.

Lo que no entendí es por qué si muevo el teléfono hacia arriba el valor de this.actual_orientation[0], que es la rotación en el eje zed como se describe [aquí] [1], el valor aumenta aunque no haya rotación.

¿Alguien supo qué sucede?

EDITAR

Otra cosa extraña ..

Probé mi solicitud en la oficina en el trabajo y tenía el comportamiento extraño he descrito antes .. Probé en la misma oficina (misma situación) una aplicación de brújula que tomé del mercado y tiene el mismo comportamiento mío ... cuando moví el teléfono hacia arriba el valor cambió consistentemente ... Probé en la misma oficina (misma situación) la brújula i-phone y no tenía ese comportamiento extraño!

Luego, cuando llegué a casa me trataron tanto, mi solicitud y la aplicación de la brújula de mi teléfono Android, y trabajaron !! incluso si me muevo hacia arriba el teléfono el valor son estables ...

Gracias a mucho.

[1]: http://developer.android.com/reference/android/hardware/SensorManager.html#getOrientation(float[], flotador [])

Respuesta

4

La estimación orientación obtenida por el dispositivo depende en parte de la dirección del campo magnético local. Dentro de los edificios, cerca de estructuras de hierro y cerca de electrodomésticos, el campo magnético percibido puede variar significativamente a lo largo de las distancias medidas en pies. Este efecto se puede ver fácilmente con un magnetómetro de mano o un medidor de Gauss.

Sospecho que estas distorsiones son responsables de un comportamiento extraño de sus aplicaciones.

1

Cuando lo levantas, introduces un ángulo de rotación y esto afecta los valores de retorno en getOrientation. El ángulo de rotación mide la cantidad de rotación de su dispositivo desde la posición normal, es decir, para la mayoría de los dispositivos donde la posición normal significa Retrato, entonces, si el teléfono está en orientación horizontal, el ángulo de rotación sería 90 o -90. Entonces, si quiere la lectura correcta, debe llamar a remapCoordinateSystem antes de llamar a getOrientation.