Используя магнитный датчик
Я хочу получить три значения координат магнитного поля, измеренные датчиком моего телефона. Для этого я получаю ручку к SensorManager
используя sm=(SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE)
, а затем получить датчик с cm=sm.getDefaultSensor(SensorManager.SENSOR_MAGNETIC_FIELD)
, Я тогда регистрирую SensorEventListener
к SensorManager
с sm.registerListener(new SensorListener(),cm,SensorManager.SENSOR_DELAY_UI)
,
КлассSensorListener
это класс моей собственной реализации SensorEventListener
интерфейс. В это OnSensorChanged
Метод, я получаю значения от датчика, и я отображаю их. Проблема в том, что я получаю только значения 1,0 и 0. И они редко обновляются (я поставил счетчик на onSensorChanged
звонки, чтобы увидеть, как часто происходит обновление). Изменение времени на SENSOR_DELAY_NORMAL
ничего не улучшает.
Чтобы проверить, была ли проблема связана с магнитным датчиком, я также добавил слушателя датчика акселерометра. Результат очень запутанный: теперь магнитный датчик генерирует обновления, а не акселерометр. И если я удаляю прослушиватель событий датчика акселерометра, я все равно получаю события магнитного датчика, которых не было до добавления прослушивателя событий датчика акселерометра.(???????????)
Любая идея о том, что не так в моем коде?
1 ответ
Просто соедините это вместе, и оно отлично работает на моем телефоне (HTC Desire, 2.2), пожалуйста, проверьте, не возникает ли у вас проблема с этим телефоном... в этом случае может возникнуть проблема с вашим устройством.
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]));
}
}
}
}
Вашему файлу макета потребуются три TextView, valMag_X, valMag_Y, valMag_Z.