#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. Возможно, было бы возможно изучить ваш код, если бы вы опубликовали весь код в том виде, в каком вы его изменили.