Java OnSensorChanged停止随机收集数据
我有一个wearOS应用程序,用于收集加速度计、陀螺仪、心率和步长数据。应用程序应该每250毫秒收集一次数据。它做得很好,但会随机暂停并停止收集数据,然后继续。我确信在测试时会将手表四处移动。 我不确定这是什么原因造成的。下面是我的代码Java OnSensorChanged停止随机收集数据,java,android,wear-os,android-wear-2.0,Java,Android,Wear Os,Android Wear 2.0,我有一个wearOS应用程序,用于收集加速度计、陀螺仪、心率和步长数据。应用程序应该每250毫秒收集一次数据。它做得很好,但会随机暂停并停止收集数据,然后继续。我确信在测试时会将手表四处移动。 我不确定这是什么原因造成的。下面是我的代码 @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate"); t1 = new Timer(); t2 = ne
@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
}
您必须按如下方式注册和取消注册侦听器
@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
}