Используя магнитный датчик - PullRequest
4 голосов
/ 13 июня 2011

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

6 голосов
/ 30 июня 2011

Просто соедините это, и оно отлично работает на моем телефоне (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.

...