Используя магнитный датчик

Я хочу получить три значения координат магнитного поля, измеренные датчиком моего телефона. Для этого я получаю ручку к 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.

Другие вопросы по тегам