Получение данных датчика в течение x секунд после нажатия кнопки. - PullRequest
0 голосов
/ 14 декабря 2011

Я все еще изучаю Android Development, поэтому извините, если этот вопрос кажется глупым, но я пытаюсь получить данные акселерометра от телефона только в течение ограниченного времени.Цель состоит в том, чтобы значения 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 - это массив, заполненный позицией X акселерометра периодически каждыеSENSOR_DELAY_GAME.

Дело в том, что этот код записывает все значения во время выполнения действия.

Мне бы хотелось, чтобы этот массив заполнялся только с момента нажатия кнопки и заполнениятолько на х секунд (еще не определился со значением х).После этого массив будет передан в другую функцию для анализа.

Я просто не понимаю, как ограничить слушателя во времени.

Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 14 декабря 2011

Вот быстрое решение; в вашем 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]);
0 голосов
/ 16 июля 2017

Решил проблему

Просто используйте метод класса Timer, делайте это каждые 1 с

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

                                     // Just calculate your accleration here

                              }
                                                 }, 0, 1000);

Лучшее решение, я думаю

0 голосов
/ 14 декабря 2011

Рассматривали ли вы использование таймера, который после 3-секундной задержки - отменить регистрацию слушателя - вызвать функцию анализа

...