2012-03-12 12 views
5

y así que necesitaba saber cuándo el teléfono basado en Android giró las direcciones x, y, z para un programa basado en inclinación y luego usé el código bien circulado que usa magnetismo y aceleración para encontrar orientación ya que el detector de orientación no es confiable y esto era bueno en los planos x, z pero digamos que una persona estaba en un autobús moviendo circularmente sus teléfonos en una posición de paisaje fijo y luego el androide registra movimiento de dirección y a pesar de que el usuario no movieron sus teléfonos en la dirección y, por lo que el programa falla, pero el solo uso de la aceleración sola tampoco es precisa y me pregunto cómo resolver este problema de detección de y- movimiento en relación con el usuario.Teoría de detección de orientación de Android

public class MotionListener { 
     String service_name = Context.SENSOR_SERVICE; 
     SensorManager sensorManager; 
     Sensor sensor; 

     public MotionListener(Context context) { 
      sensorManager = (SensorManager) context.getSystemService(service_name); 
      SensorManager sm = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 
      Sensor aSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
      Sensor mfSensor = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
      sm.registerListener(myAccelerometerListener, aSensor, SensorManager.SENSOR_DELAY_GAME); 
      sm.registerListener(myMagneticFieldListener, mfSensor, SensorManager.SENSOR_DELAY_GAME); 
     } 

     float[] accelerometerValues; 
     float[] magneticFieldValues; 
     final SensorEventListener myAccelerometerListener = new SensorEventListener() { 
      public void onSensorChanged(SensorEvent sensorEvent) { 
       if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
        accelerometerValues = sensorEvent.values; 
       float[] values = new float[3]; 
       float[] R = new float[9]; 
       try { 
        SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticFieldValues); 
        SensorManager.getOrientation(R, values); 
        values[0] = (float) ((float) values[0] * 180/Math.PI); 
        values[1] = (float) ((float) values[1] * 180/Math.PI); 
        values[2] = (float) ((float) values[2] * 180/Math.PI); 
        System.out.println((int)values[0] + " " + (int)values[1] + "  " + (int)values[2]); 
        setTiltCoordinates(values); 
       } catch (NullPointerException e) { 
       } 
      public void onAccuracyChanged(Sensor sensor, int accuracy) { 
      } 
     }; 
+3

no es posible - sin indicar la orientación del usuario al dispositivo - que es una pregunta completamente diferente – KevinDTimm

+0

No. No puedo hacerlo [Marcos de referencia] (http://en.wikipedia.org/wiki/Frame_of_reference), etc. Como usuario, intentar usar una aplicación de este tipo en esas condiciones es un ejercicio inútil, de todos modos. – Cheezmeister

+0

+1 Estoy buscando el mismo – Sameer

Respuesta

4

Bueno, si solo está mirando los datos del acelerómetro, todo lo que tiene son tres valores en las direcciones x, y y z. Uno de ellos tendrá la mayor atracción, y generalmente puede tomar esto como que significa que es la dirección 'abajo'.

Puede haber problemas con el movimiento, como que el usuario gire en el acto, haciendo que el teléfono sienta una aceleración que no es debida a la gravedad, si esto es suficientemente grande, podría comenzar a mirar hacia abajo Sin embargo, tendrías que estar girando lo suficientemente rápido para crear cerca de un g de aceleración, lo cual dudo mucho de que un autobús pueda hacer.

El siguiente gran problema es que los valores de datos x, yy z son solo tres ejes perpendiculares a los que cada teléfono podría estar orientado de forma diferente. En un teléfono, 'y' (lo que normalmente se considera el eje arriba y abajo) podría ser a través de la pantalla, con la pantalla en el zx, plano. Otro teléfono podría tener y en ángulo con la pantalla.

Por lo tanto, a partir de los datos del acelerómetro no se puede decir en qué dirección de orientación está el teléfono. Sin embargo, tal vez el SDK de Android cuenta para esto y 'ajusta' los datos reales del acelerómetro para permitir que todos los teléfonos vean los mismos datos.

+0

Debería haber sido más claro, la aplicación mueve un objeto a través de la inclinación. Digamos que el usuario desea mover perpetuamente el objeto hacia el oeste, luego tendría que seguir bombeando el teléfono si la aceleración fuera el único sensor. Esto no funciona –

+0

quiere decir que quiere hacer algo como inclinar una pelota en el teléfono mientras está en posición horizontal ... – thecoshman

+0

¿O desea datos de orientación alrededor de un eje? –