Uso del sensor magnético

Quiero obtener los tres valores de coordenadas del campo magnético medida por el sensor de mi teléfono. Para ello, obtengo un identificador para el SensorManager utilizando sm=(SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE) , y luego obtener el sensor con cm=sm.getDefaultSensor(SensorManager.SENSOR_MAGNETIC_FIELD) . Entonces registro un SensorEventListener al SensorManager con sm.registerListener(new SensorListener(),cm,SensorManager.SENSOR_DELAY_UI) .

La clase SensorListener es una clase propia implementando la interfaz SensorEventListener . En su método OnSensorChanged , obtengo los valores del sensor y los OnSensorChanged . El problema es que sólo obtengo los valores 1,0 y 0. Y rara vez se actualizan (he puesto un contador en las llamadas onSensorChanged para ver con qué frecuencia se lleva a cabo la actualización). Cambiar la hora a SENSOR_DELAY_NORMAL mejora nada.

Para comprobar si el problema estaba relacionado con el sensor magnético, he añadido, de la misma manera, un oyente a un sensor de acelerómetro. El resultado es muy confuso: ahora, el sensor magnético genera actualizaciones, pero no el acelerómetro. Y si elimino el receptor de eventos del sensor del acelerómetro, sigo recibiendo los eventos del sensor magnético que faltan antes de agregar el detector de eventos del sensor del acelerómetro. (???????????)

¿Alguna idea de lo que está mal en mi código?

Sólo tiene que poner esto y funciona bien en mi teléfono (HTC Desire, 2.2), por favor, compruebe si se enfrenta a un problema en su teléfono con este … en cuyo caso puede haber un problema con su dispositivo.

 package com.SmartPhoneGizmos.examples.MagSensor; 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; public class MagSensorActivity extends Activity implements SensorEventListener { private TextView magneticX; private TextView magneticY; private TextView magneticZ; private SensorManager sensorManager = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); // Capture magnetic sensor related view elements magneticX = (TextView) findViewById(R.id.valMag_X); magneticY = (TextView) findViewById(R.id.valMag_Y); magneticZ = (TextView) findViewById(R.id.valMag_Z); // Register magnetic sensor sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Unregister the listener sensorManager.unregisterListener(this); super.onPause(); } @Override protected void onStop() { // Unregister the listener sensorManager.unregisterListener(this); super.onStop(); } @Override protected void onResume() { super.onResume(); // Register magnetic sensor sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL); } public void onAccuracyChanged(Sensor sensor, int accuracy) { // Ignoring this for now } public void onSensorChanged(SensorEvent sensorEvent) { synchronized (this) { if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { magneticX.setText( Float.toString( sensorEvent.values[0])); magneticY.setText( Float.toString( sensorEvent.values[1])); magneticZ.setText( Float.toString( sensorEvent.values[2])); } } } } 

Su archivo de diseño necesitará tres TextViews, valMag_X, valMag_Y, valMag_Z.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.