2012-01-13 12 views
8

Estoy intentando conseguir el ángulo de inclinación, ángulo de balanceo de mis sensores de mi teléfono androide pero sin éxito hasta el momento,obtener el ángulo de inclinación Android

cuando hago clic en el botón de mi lo que me deben dar los 3 ángulos , me sale "los resultados: 0.0 -0.0 -0.0"

package com.example; 

import android.app.Activity; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.widget.Button; 
import android.view.View; 


public class MyActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     final float[] mValuesMagnet  = new float[3]; 
     final float[] mValuesAccel  = new float[3]; 
     final float[] mValuesOrientation = new float[3]; 
     final float[] mRotationMatrix = new float[9]; 

     final Button btn_valider = (Button) findViewById(R.id.btn1); 
     final TextView txt1 = (TextView) findViewById(R.id.textView1); 
     final SensorEventListener mEventListener = new SensorEventListener() { 
      public void onAccuracyChanged(Sensor sensor, int accuracy) { 
      } 

      public void onSensorChanged(SensorEvent event) { 
       // Handle the events for which we registered 
       switch (event.sensor.getType()) { 
        case Sensor.TYPE_ACCELEROMETER: 
         System.arraycopy(event.values, 0, mValuesAccel, 0, 3); 
         break; 

        case Sensor.TYPE_MAGNETIC_FIELD: 
         System.arraycopy(event.values, 0, mValuesMagnet, 0, 3); 
         break; 
       } 
      }; 
     }; 
     btn_valider.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View view) 
      { 
       SensorManager.getRotationMatrix(mRotationMatrix, null, mValuesAccel, mValuesMagnet); 
       SensorManager.getOrientation(mRotationMatrix, mValuesOrientation); 
       final CharSequence test; 
       test = "results: " + mValuesOrientation[0] +" "+mValuesOrientation[1]+ " "+ mValuesOrientation[2]; 
       txt1.setText(test); 
      } 
     }); 

    } 
} 

Respuesta

17

Su casi allí con el código de Mike, pero que permitan a los datos a ser recuperada por el detector de eventos para cualquiera de los sensores, el detector de eventos y el sensor deseado debe estar registrado con la clase SensorManager usando:

SensorManager _sensorManager; 

_sensorManager.registerListener(mEventListener, _sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
       SensorManager.SENSOR_DELAY_NORMAL); 

A continuación se muestra el código adaptado para mostrar los datos que creo que es lo que desea ver.

import android.app.Activity; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.widget.Button; 
import android.view.View; 


public class StackOverflowTestingGroundActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);   

     SensorManager sensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);   

     final float[] mValuesMagnet  = new float[3]; 
     final float[] mValuesAccel  = new float[3]; 
     final float[] mValuesOrientation = new float[3]; 
     final float[] mRotationMatrix = new float[9]; 

     final Button btn_valider = (Button) findViewById(R.id.btn1); 
     final TextView txt1 = (TextView) findViewById(R.id.textView1); 
     final SensorEventListener mEventListener = new SensorEventListener() { 
      public void onAccuracyChanged(Sensor sensor, int accuracy) { 
      } 

      public void onSensorChanged(SensorEvent event) { 
       // Handle the events for which we registered 
       switch (event.sensor.getType()) { 
        case Sensor.TYPE_ACCELEROMETER: 
         System.arraycopy(event.values, 0, mValuesAccel, 0, 3); 
         break; 

        case Sensor.TYPE_MAGNETIC_FIELD: 
         System.arraycopy(event.values, 0, mValuesMagnet, 0, 3); 
         break; 
       } 
      }; 
     }; 

     // You have set the event lisetner up, now just need to register this with the 
     // sensor manager along with the sensor wanted. 
     setListners(sensorManager, mEventListener); 

     btn_valider.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View view) 
      { 
       SensorManager.getRotationMatrix(mRotationMatrix, null, mValuesAccel, mValuesMagnet); 
       SensorManager.getOrientation(mRotationMatrix, mValuesOrientation); 
       final CharSequence test; 
       test = "results: " + mValuesOrientation[0] +" "+mValuesOrientation[1]+ " "+ mValuesOrientation[2]; 
       txt1.setText(test); 
      } 
     }); 

    } 

    // Register the event listener and sensor type. 
    public void setListners(SensorManager sensorManager, SensorEventListener mEventListener) 
    { 
     sensorManager.registerListener(mEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
       SensorManager.SENSOR_DELAY_NORMAL); 
     sensorManager.registerListener(mEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
       SensorManager.SENSOR_DELAY_NORMAL); 
    } 
} 
+0

gracias, que lo hizo –

+0

estos ángulo da valor muy pequeño e incluso si se mantiene en la superficie plana sigue cambiando –

+0

valores @AashishVirendraKBhatnagar están en radianes sensores + no son tan precisos –

Cuestiones relacionadas