微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 如何以固定的速率从Android Motion Sensors记录数据

我正在学习 Android编程的基础知识.

我有一个简单的android测试应用程序,其中我将加速度计,磁力计和方向数据记录到外部文件,同时显示它.我通过调用一个方法initLogger来启动点击Start按钮(相关传感器的registerListener)的记录过程.

看起来像这样的东西…

public void initLogger(View view)
{
    boolean bFlag = false;

    Button btnStart = (Button)findViewById(R.id.btnStartLog);
    Button btnStop = (Button)findViewById(R.id.btnStopLog);

    btnStart.setEnabled(bFlag);
    btnStop.setEnabled(!bFlag);

    bEnableLogging = true;
    //Start reading the sensor values
    sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_UI);
    sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_UI);

   //so on....

还有一个停止按钮,它将停止记录过程(最后通过调用每个传感器的unregisterListener注销)

数据检索过程发生在onSensorChanged处理程序内,该处理程序将从相关传感器检索数据,将值设置为各个UI元素,并最终将数据记录到外部.csv文件.

onSensorChanged事件处理器看起来像这样…

public void onSensorChanged(SensorEvent event) {


    // Todo Auto-generated method stub
    // accelerometer
    TextView tAX = (TextView) findViewById(R.id.txtViewAxValue);
    TextView tAY = (TextView) findViewById(R.id.txtViewAyValue);
    TextView tAZ = (TextView) findViewById(R.id.txtViewAzValue);

    // magnetic field
    TextView tMX = (TextView) findViewById(R.id.txtViewMx);
    TextView tMY = (TextView) findViewById(R.id.txtViewMy);
    TextView tMZ = (TextView) findViewById(R.id.txtViewMz);

    if (bEnableLogging) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

            accelerometerdata = event.values.clone();

            tAX.setText(Double.toString(accelerometerdata[0]));
            tAY.setText(Double.toString(accelerometerdata[1]));
            tAZ.setText(Double.toString(accelerometerdata[2]));


        }

        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

            magneticmatrixdata = event.values.clone();

            tMX.setText(Double.toString(magneticmatrixdata[0]));
            tMY.setText(Double.toString(magneticmatrixdata[1]));
            tMZ.setText(Double.toString(magneticmatrixdata[2]));

        }

               // so on ....

尽管我从所有配置的传感器接收到数据,但是我无法控制接收数据的速率.即

我知道SensorChanged事件在Sensor数据更改时触发.不过,我希望这个事件能以固定的价格被开除.例如:每40ms

题:

>如何确保SensorChanged事件以恒定速率被触发?
>在这种情况下,Java中的TimerTask类是否有任何帮助?

专家在这里在SO.Please帮助我:)

解决方法

既然你知道如果没有SensorChanged事件触发,没有改变,你可以使用你的旧值.
当您以特定的时间间隔要求提供LOG数据时,我不会在onSensorChanged方法中执行任何输出,只需将新数据克隆到accelerationometerdata变量.
并且每40ms记录加速度计数据的值.这样,即使数据没有改变,您每40ms记录实际值.

注意:根据Ridcullys答案,似乎也可能以特定的时间间隔获取传感器数据“传送”.但是由于Android上的传感器数据一直存在延迟,因此我们的解决方案将会更精确地在40ms的间隔内.另一方面,如果传感器数据在您记录的时刻发生变化,则可能会发生一段时间延迟新数据.我猜(不知道这一点) – 由于它只是关于日志记录,而不是像“尽可能快地实现它”,所以这不是一个要求 – 定时器解决方案导致更少的cpu负载.

原文地址:https://www.jb51.cc/android/125462.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐