Использование магнитного датчика

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

Чтобы проверить, связана ли проблема с магнитным датчиком, я таким же образом добавил прослушиватель датчика акселерометра. Результат очень сбивает с толку: теперь магнитный датчик генерирует обновления, а не акселерометр. И если я удалю прослушиватель событий датчика акселерометра, я все равно буду получать события магнитного датчика, которые отсутствовали до добавления прослушивателя событий датчика акселерометра. (???????????)

Любая идея о том, что не так в моем коде?


person Zelig    schedule 13.06.2011    source источник
comment
Вы пытались изменить SensorManager.SENSOR_DELAY_UI на другое значение?   -  person Vincent Mimoun-Prat    schedule 13.06.2011
comment
Вам нужно принять ответы на свои предыдущие вопросы, иначе вы не получите большой помощи (поставьте галочку рядом с ответом, который решил вашу проблему).   -  person Vincent Mimoun-Prat    schedule 13.06.2011


Ответы (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.

person Anindo Ghosh    schedule 30.06.2011
comment
Что ж, код, который вы мне дали, работает отлично. Фактически, через несколько дней мой магнитный датчик тоже работал нормально, как я упоминал в своем последнем абзаце. Но когда я пытаюсь изменить свой или ваш код, чтобы получить значения от датчиков акселерометра, я все равно получаю значения магнитного поля. Любая идея, которая могла бы объяснить это странное поведение? - person Zelig; 02.07.2011
comment
Всегда приятно принимать ответы, поддерживает интерес человека, дающего ответы. Трудно угадать ответ на ваш расширенный вопрос, не видя вашего кода, поэтому вставка ваших изменений здесь поможет. - person Anindo Ghosh; 07.07.2011
comment
Сделанное изменение очень простое: замена всего Sensor.TYPE_MAGNETIC_FIELD на Sensor.TYPE_ACCELEROMETER. - person Zelig; 08.07.2011
comment
Возможно, можно будет изучить ваш код, если вы опубликуете весь код, как вы его изменили. - person Anindo Ghosh; 13.07.2011