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

#java #android #magnetometer

#java #Android #магнитометр

Вопрос:

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

2. Вам нужно принять ответы на ваши предыдущие вопросы, иначе вы не получите большой помощи (установите флажок рядом с ответом, который разрешил вашу проблему).

Ответ №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]));
            }
        }

    }
}
  

Для вашего файла макета потребуется три TextViews: valMag_X, valMag_Y, valMag_Z.

Комментарии:

1. Что ж, код, который вы мне дали, работает отлично. На самом деле, с нескольких дней мой также отлично работал с магнитным датчиком, как я упоминал в моем последнем абзаце. Но, когда я пытаюсь изменить свой код или ваш, чтобы получить значения с датчиков акселерометра, я по-прежнему получаю значения магнитного поля. Есть идеи, которые могли бы объяснить это странное поведение?

2. Всегда приятно принимать ответы, это поддерживает интерес человека, дающего ответы. Трудно угадать ответ на ваш расширенный вопрос, не видя вашего кода, поэтому вставка ваших изменений здесь помогла бы.

3. Внесенное изменение очень простое: изменение всего «Датчика. TYPE_MAGNETIC_FIELD»для» датчика. TYPE_ACCELEROMETER»

4. Возможно, было бы возможно изучить ваш код, если бы вы опубликовали весь код в том виде, в каком вы его изменили.