ARK
ARK

Reputation: 1

OnSensorChanged stops collecting data randomly

I have a wearOS application that is collecting accelerometer, gyroscope, heart rate, and step data. The application is supposed to collect data every 250 milliseconds. It does this well but it will make random pauses and stop collecting data and then resume. I am being sure to move the watch around while testing. In this image you can see it stopped collecting data for about 7 seconds. Look at the time stamp on the right

I am not sure whats causing this. Here is my code below

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate");


    t1 = new Timer();
    t2 = new Timer();
    t3 = new Timer();
    t4 = new Timer();
    Log.d(TAG, "onCreate: Creating thread");
    HandlerThread thread = new HandlerThread("SensorServiceThread", Process.THREAD_PRIORITY_BACKGROUND);
    thread.start();
    Log.d(TAG, "onCreate: Finished creating thread");

    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);

    Util.initTimeStamps(this);
}

private void initSensor(){
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

    registerListeners();
}


private void registerListeners(){

    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);

    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
            (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);


    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE),
            (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);

    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
            (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);
}


@Override
public void onSensorChanged(SensorEvent event) {

    if(flag){
        flag = false;

        switch(event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
            processAccelerometerData(event);
            //Log.d("acc","Acc Works");

            break;

            case Sensor.TYPE_GYROSCOPE:
            processGyroData(event);

            //Log.d("gyro","Gyro Works");
            break;

            case Sensor.TYPE_STEP_COUNTER:


            float[] values = event.values;

            float x = values[0];
            Log.e("step", String.valueOf(x));
            steppre = (int) x;

            processStepData(event);
            Log.d("step","steps work 2");

            break;

            case Sensor.TYPE_HEART_RATE:
            //check if sensor is not in touch with user or sensor status itself is unreliable, then ignore!
            if(event.accuracy == SensorManager.SENSOR_STATUS_NO_CONTACT || event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
                return;

            processHeartRateData(event);


            break;


            default:
            Log.d(TAG, "onSensorChanged:: "+event.values[0]);


        }
    }
}

Upvotes: 0

Views: 96

Answers (1)

Eyosiyas
Eyosiyas

Reputation: 1497

You have to register and unregister the listeners as follows.

   @Override
    public void onResume() {
        super.onResume();
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);

        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
                (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);


        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE),
                (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);

        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
                (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);

    }

    @Override
    public void onPause() {
        super.onPause();
        //and unregister the listeners here
    }

Upvotes: 2

Related Questions