OnSensorChanged停止随机收集数据



我有一个wearOS应用程序,它正在收集加速度计、陀螺仪、心率和步长数据。应用程序应该每250毫秒收集一次数据。它做得很好,但它会随机暂停,停止收集数据,然后继续。我肯定会在测试时把手表移来移去。在这张图中,你可以看到它停止收集数据大约7秒。查看右侧上的时间戳

我不确定是什么原因造成的。这是我在下面的代码

@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]);

}
}
}

您必须按照如下方式注册和注销侦听器。

@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
}

最新更新