有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何为步进计数器设置步间的最小时间?

我创建了一个步进计数器,我注意到你可以通过摇动这个设备在一秒钟内数到六步。 如何设置每个步骤之间的最小时间量以使其更准确?例如,使其至少有四分之一秒的时间,然后才能将下一步计算为一个步骤。如果这不是一个很好的解决方案,使它更准确,那么请让我知道

下面是代码,它包括一个计时器,每十分钟只计算一次总的步数,所以忽略它

public class StepCounterManager implements SensorEventListener{

boolean timerStarted = false;
private float initCount, finalCount, currentCount;

public Activity activity;
private boolean activityRunning;

private SensorManager sensorManager;

public StepCounterManager(Activity activity){
    this.activity = activity;
}

public void stepCounterInit(){
    sensorManager = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);
    timer();
    timerStarted = true;
}

//timer starts at the start of app and restarts every 10 minutes
public void timer(){
    Timer t = new Timer(false);
    Toast.makeText(this.activity, "timer started", Toast.LENGTH_SHORT).show();
    t.schedule(new TimerTask() {
        @Override
        public void run() {
            activity.runOnUiThread(new Runnable() {
                public void run() {
                    getFinalStepCount();
                }
            });
        }
    },  600000);
}

public void register(){
    activityRunning = true;
    Sensor countSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
    if(countSensor != null){
        sensorManager.registerListener(this, countSensor, SensorManager.SENSOR_DELAY_UI);
    } else {
        Toast.makeText(this.activity, "Count sensor not available", Toast.LENGTH_SHORT).show();
    }
}

public void unRegister(){
    activityRunning = false;
}

@Override
public void onSensorChanged(SensorEvent event) {
    if(activityRunning){
        currentCount = event.values[0];
        System.out.println(currentCount);
    }
    if(timerStarted){
        resetInitialStepCount();
    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

//a new initial count has to be made because the step count can only reset after a reboot
public void resetInitialStepCount(){
    initCount = currentCount;
    Toast.makeText(this.activity, "initial count is: " + initCount, Toast.LENGTH_SHORT).show();
    timerStarted = false;
}

public void getFinalStepCount(){
    finalCount = currentCount-initCount;
    Toast.makeText(this.activity, "final count is: " + finalCount, Toast.LENGTH_SHORT).show();
    resetInitialStepCount();
    timer();
    //todo: send finalcount to database
}

}


共 (1) 个答案

  1. # 1 楼答案

    public class StepCounterManager implements SensorEventListener{
    
    boolean timerStarted = false;
    private float initCount, finalCount, currentCount;
    
    public Activity activity;
    private boolean activityRunning;
    private boolean hasRecorded;
    private SensorManager sensorManager;
    private int storedSteps;
    
    public StepCounterManager(Activity activity){
        this.activity = activity;
        this.hasRecorded = false;
        this.storedSteps = 0;
    }
    
    public void stepCounterInit(){
        sensorManager = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);
        timer();
        timerStarted = true;
    }
    
    //timer starts at the start of app and restarts every 10 minutes
    public void timer(){
        Timer t = new Timer(false);
        Toast.makeText(this.activity, "timer started", Toast.LENGTH_SHORT).show();
        t.schedule(new TimerTask() {
            @Override
            public void run() {
                activity.runOnUiThread(new Runnable() {
                    public void run() {
                        getFinalStepCount();
                    }
                });
            }
        },  600000);
    }
    
    public void register(){
        activityRunning = true;
        Sensor countSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
        if(countSensor != null){
            sensorManager.registerListener(this, countSensor, SensorManager.SENSOR_DELAY_UI);
        } else {
            Toast.makeText(this.activity, "Count sensor not available", Toast.LENGTH_SHORT).show();
        }
    }
    
    public void unRegister(){
        activityRunning = false;
    }
    
    @Override
    public void onSensorChanged(SensorEvent event) {
       if(hasRecorded == false){
       hasRecorded = true;
       BlockRecording();
        if(activityRunning){
            int TempCurrent = event.values[0] - storedSteps;
            currentCount = currentCount + (event.values[0] - TempCurrent);
            System.out.println(currentCount);
        }
        if(timerStarted){
            resetInitialStepCount();
        }
       storedSteps = event.values[0];
    }else{
    }
    }
    
    
    public void BlockRecording(){
    Timer t = new Timer(false);
        t.schedule(new TimerTask() {
            @Override
            public void run() {
                activity.runOnUiThread(new Runnable() {
                    public void run() {
                        hasRecorded = false;
                    }
                });
            }
        },  250);
    }
    
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
    }
    
    //a new initial count has to be made because the step count can only reset after a reboot
    public void resetInitialStepCount(){
        initCount = currentCount;
        Toast.makeText(this.activity, "initial count is: " + initCount, Toast.LENGTH_SHORT).show();
        timerStarted = false;
    }
    
    public void getFinalStepCount(){
        finalCount = currentCount-initCount;
        Toast.makeText(this.activity, "final count is: " + finalCount, Toast.LENGTH_SHORT).show();
        resetInitialStepCount();
        timer();
        //todo: send finalcount to database
    }
    }