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.
- Obtener información de los sensores magnéticos
- Rodamiento de brújula de Android
- Comportamiento extraño de las medidas del campo magnético mientras gira el dispositivo
- Android - SensorManager comportamiento extraño de getOrientation
- TYPE_ROTATION_VECTOR, TYPE_ORIENTATION dan resultados diferentes que también con desviación
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?
- ¿Cómo obtengo el ángulo del teléfono en relación con el campo magnético de la Tierra?
- ¿Cómo obtener el azimut de un teléfono con lecturas de brújula y lecturas de giroscopio?
- Android nGPS: obtener ubicación basada en el campo magnético en lugar de gps o triangulación de células
- ¿Diferencia entre sensor de orientación y sensor de campo magnético en Android?
- Sensores para teléfonos móviles
- Convertir los valores del campo magnético X, Y, Z desde el dispositivo en el marco de referencia global
- ¿Cómo reemplazar adecuadamente Sensor.TYPE_ORIENTATION (que ahora está obsoleto)?
- Sensor.TYPE_ROTATION_VECTOR tiene deriva: ¿Hay una alternativa?
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.