【问题标题】:Listening to multiple Sensors and updating multiple TextViews with the sensor values on Android在 Android 上监听多个传感器并使用传感器值更新多个 TextView
【发布时间】:2013-10-20 14:40:07
【问题描述】:

我一直在开发一个神秘的应用程序,它允许用户同时获取多个传感器值并将它们显示在 Listview 上。然而,令我沮丧的是,我一直无法通过获取加速度计值,仅此而已。我尝试了多种方法来注册所有可用的传感器,如陀螺仪、磁场、方向等。它们都没有检索值,因为加速度计优先并每次都被触发。有没有办法同时注册多个传感器并从中获取数据来更新 UI。

mAccelerometerListener = new SensorEventListener() {
        @Override
        public void onAccuracyChanged(Sensor arg0, int arg1) {
        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            Sensor sensor = event.sensor;
            //Update UI
            } 
        }
    };

    mGyroscopeListener = new SensorEventListener() {

        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
                //Update Ui

            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    };

    mMagnetometerListener = new SensorEventListener() {

        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                //Update UI
                }

            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    };

if (Config.isSensorPresent(ACCELERATION)) {
        //sendMessageToService(Sensor.TYPE_ACCELEROMETER);
        mSensorManager.registerListener(mAccelerometerListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
    }
    // Detect whether the device has Gyroscope on it
    if (Config.isSensorPresent(GYROSCOPE)) {
        //sendMessageToService(Sensor.TYPE_GYROSCOPE);
        mSensorManager.registerListener(mGyroscopeListener, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_GAME);
    }
    // Detect whether the device has Magnetic Field Sensor
    if (Config.isSensorPresent(MAGNETIC_FIELD)) {
        //sendMessageToService(Sensor.TYPE_MAGNETIC_FIELD);
        mSensorManager.registerListener(mMagnetometerListener, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_GAME);
    }

这似乎不会同时更新所有这些。哎呀,它甚至不会触发其他类型的传感器。

已尝试Is there a way to retrieve multiple sensor data in Android 建议的方法。不适合我。

【问题讨论】:

  • 请发布完整代码

标签: android accelerometer sensors


【解决方案1】:

我认为第 8 行可能是您的问题。不过你也可以试试下面的代码:

    public class MainActivity extends AppCompatActivity implements 
    SensorEventListener{
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            SensorManager sm = (SensorManager)this.getSystemService(SENSOR_SERVICE);
            Sensor se = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            sm.registerListener((SensorEventListener) this, se, SensorManager.SENSOR_DELAY_GAME);
            Sensor se1 = sm.getDefaultSensor(TYPE_GYROSCOPE);
            sm.registerListener((SensorEventListener) this, se1, SensorManager.SENSOR_DELAY_GAME);
            Sensor se2 = sm.getDefaultSensor(TYPE_MAGNETIC_FIELD);
            sm.registerListener((SensorEventListener) this, se2, SensorManager.SENSOR_DELAY_GAME);
    }

        @Override
        public void onSensorChanged(SensorEvent event) {
            if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
                 //Update UI        
            }
            if(event.sensor.getType()==Sensor.TYPE_GYROSCOPE){
            //UpdateUI
             }
            if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
            //UpdateUI
            }

        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    }

此代码应该可以工作,因为只要以上三个传感器值中的任何一个发生更改(几乎总是),就会调用此函数 (OnSensorChanged())。 如果不是这样,那么问题可能出在您的 updateUI 代码中。

【讨论】:

    【解决方案2】:

    有一个传感器事件监听器并将所有传感器注册到它,但在 onSensorChanged() 方法中,您可以找出哪个传感器调用了它并采取相应措施。

    public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE)//update gyro
    if (event.sensor.getType() == //acclometer)update acc
    .
    .
    .
    so on
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      相关资源
      最近更新 更多