0

如果这个问题看起来很愚蠢,我仍在学习 Android 开发,很抱歉,但我只是在有限的时间内尝试从手机获取加速度计数据。目标是在单击按钮后仅记录传感器的 x 坐标值约 3 秒。

public class AccelerometerTestingActivity extends Activity implements SensorEventListener {
    private SensorManager sensorManager;
    float x_event[];
    @Override
    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
        // add listener. The listener will be HelloAndroid (this) class
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_GAME);

    }

    public void onAccuracyChanged(Sensor sensor,int accuracy){

    }

    public void onSensorChanged(SensorEvent event){

        // check sensor type
        if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){

            // assign directions
            float x=event.values[0];
            x_event=addArrayElement(x_event,x);
        }
    }

    private float[] addArrayElement(float[] currentArray, float x) {
        // TODO Auto-generated method stub
        float newArray[] = new float[currentArray.length+1];
        int i= 0;

        for(i=0;i<currentArray.length;i++)
        {
            newArray[i] = currentArray[i];
        }

        newArray[i+1]=x;

        return newArray;
    }

所以 x_event 是一个数组,每个 SENSOR_DELAY_GAME 周期性地填充加速度计的 X 位置。

问题是,此代码在活动运行时记录所有值。

我想要的是仅在单击按钮时填充此数组,并且仅填充 x 秒(尚未确定 x 的值)。之后,数组将被传递给另一个函数进行分析。

我只是不明白如何及时限制监听器。

感谢您的帮助。

4

3 回答 3

1

这是一个快速的解决方案;在你onCreate()注册了你的听众之后,你可以这样做:

    final SensorEventListener listener = this;
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            sensorManager.unregisterListener(listener);
        }
    }, theTimeInMilliseconds);

您还应该考虑使用列表而不是数组来保存您的值,因此您不必在每次获得新值时都重新创建它:

ArrayList<Float> xEvent = new ArrayList<Float>();

并添加项目:

xEvent.add(event.values[0]);
于 2011-12-14T15:00:32.060 回答
0

您是否考虑过使用一个计时器,该计时器会在 3 秒延迟后 - 取消注册侦听器 - 调用您的分析函数?

于 2011-12-14T14:58:32.547 回答
0

解决了问题

只需使用 Timer 类方法每 1 秒执行一次

new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {

                                     // Just calculate your accleration here

                              }
                                                 }, 0, 1000);

我认为更好的解决方案

于 2017-07-16T17:03:36.783 回答