Java 计算速度类型计数器步进传感器

Java 计算速度类型计数器步进传感器,java,android,Java,Android,我很快就要完成我的项目了,它涉及到计算步数、覆盖距离和计算速度。我正在使用TYPE_COUNTER_STEP sensor来计算步长,并使用公式来计算距离,即男性为0.415,女性为0.413,通过乘以身高来计算脚长。到目前为止,一切正常,但我无法计算速度。我不知道如何计算,我的意思是我知道s=vt,但我需要时间来获得速度/步长。任何人都知道如何做到这一点。这是我项目的最后一部分。我也在网上找过,但我没有找到计算时间的工作方法。有人建议我使用时间戳,但我使用了,但不幸的是,我得到的是无限文本而不

我很快就要完成我的项目了,它涉及到计算步数、覆盖距离和计算速度。我正在使用TYPE_COUNTER_STEP sensor来计算步长,并使用公式来计算距离,即男性为0.415,女性为0.413,通过乘以身高来计算脚长。到目前为止,一切正常,但我无法计算速度。我不知道如何计算,我的意思是我知道s=vt,但我需要时间来获得速度/步长。任何人都知道如何做到这一点。这是我项目的最后一部分。我也在网上找过,但我没有找到计算时间的工作方法。有人建议我使用时间戳,但我使用了,但不幸的是,我得到的是无限文本而不是速度

我无法使用GPS计算速度,因为GPS并非始终可用,即隧道内或地下等
谢谢

package com.lijianzhong13354146.coeur1;
导入android.app.Activity;
导入android.content.Context;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.graphics.Color;
导入android.hardware.Sensor;
导入android.hardware.SensorEvent;
导入android.hardware.SensorEventListener;
导入android.hardware.SensorManager;
导入android.media.MediaPlayer;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.Message;
导入android.support.v7.app.AppActivity;
导入android.support.v7.widget.Toolbar;
导入android.text.format.DateUtils;
导入android.view.Display;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.concurrent.TimeUnit;
公共类AccurateStepCounter扩展AppCompative活动{
私有长时间戳;
私有TextView textViewStepCounter;
私有文本视图文本视图步骤检测器;
私有线程detectorTimeStampUpdaterThread;
私人经办人;
工具栏;
私人按钮按钮;
文本视图步长值;
文本视图距离值;
文本视图距离标题;
int getCurrentStepValue;
int-actualStepTaken;
SharedReferences SharedReferences;
SharedReferences.Editor;
SharedReferencesSharedReferencesFromSetting;
SharedReferences.Editor编辑器编辑器FromSetting;
私有布尔值isRunning=true;
ArrayList ArrayList;
人高;
双吸人高度;
双步长;
SharedReferences获取SharedReferencesHeight;
编辑器getEditoHeight;
双时间键;
SharedReferencesSharedReferencesGetGender;
SharedReferences.Editor editorGetGender;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u精确的步进计数器);
buttonStop=(按钮)findViewById(R.id.buttonStop);
toolbar=(toolbar)findviewbyd(R.id.toolbar);
stepValue=(TextView)findViewById(R.id.step_值);
距离值=(TextView)findViewById(R.id.distance\u值);
arrayList=新的arrayList();
SharedReferences=GetSharedReferences(“保存信息”,模式为私有);
SharedReferencesFromSetting=GetSharedReferences(“EmailSave”,模式\私人);
sharedPreferencesGetGender=getSharedPreferences(“保存信息”,模式为私有);
GetSharedReferencesHeight=GetSharedReferences(“高度”,模式\私有);
distanceTitle=(TextView)findViewById(R.id.distance\u title);
gettingPersonHeightInDoule=Double.parseDouble(
getSharedReferencesHeight.getString(“saveHeight”,“0”)/100;
if(sharedPreferencesGetGender.getString(“性别”,null).equals(“男性”)){
步进长度=0.415*获取人员高度单位;
}否则{
步进长度=0.413*获取人员高度单位;
}
工具栏配置();
MediaPlayer mediaPlayer1=MediaPlayer.create(this,R.raw.boom);
mediaPlayer1.start();
传感器注册人();
onStopButtonClick();
//setupDetectorTimeStamppupDaterThread();
}
@凌驾
public void onBackPressed(){
}
公共无效OnStopButton单击(){
buttonStop.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int actualSteps=getCurrentStepValue-arrayList.get(0);
editor=SharedReferences.edit();
editor.putString(“步骤”,String.valueOf(actualSteps));
commit();
startActivity(新意图(AccurateStepCounter.this,FinalResultDisplay.class));
}
});
}
公共空工具栏配置(){
setTitle(getResources().getString(R.string.app_title));
工具栏。设置子标题(“计步器”);
toolbar.setTitleTextColor(Color.WHITE);
toolbar.setSubtitleTextColor(Color.WHITE);
设置支持操作栏(工具栏);
}
传感器的公共无效登记处(){
SensorManager sManager=(SensorManager)getSystemService(Context.SENSOR\u SERVICE);
//步进计数器
sManager.registerListener(新的SensorEventListener(){
@凌驾
传感器更改时的公共无效(传感器事件){
步骤=新步骤(event.values[0],System.currentTimeMillis());
arrayList.add(步骤);
getCurrentStepValue=(int)步骤。getStep();
setText(getCurrentStepValue-arrayList.get(0)+“”);
double distaneCovered=步长*(getCurrentStepValue-arrayList.get(0));
package com.lijianzhong13354146.coeur1;



import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.format.DateUtils;
import android.view.Display;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class AccurateStepCounter extends AppCompatActivity {

    private long timestamp;

    private TextView textViewStepCounter;

    private TextView textViewStepDetector;

    private Thread detectorTimeStampUpdaterThread;

    private Handler handler;
    Toolbar toolbar ;
    private Button buttonStop ;
    TextView stepValue ;
    TextView distanceValue ;
    TextView distanceTitle ;

    int getCurrentStepValue ;
    int actualStepTaken ;
    SharedPreferences sharedPreferences ;
    SharedPreferences.Editor editor ;
    SharedPreferences sharedPreferencesFromSetting ;
    SharedPreferences.Editor editorFromSetting ;
    private boolean isRunning = true;
    ArrayList<Step> arrayList ;
    String gettingPersonHeight ;
    double gettingPersonHeightInDoule ;
    double step_length ;
SharedPreferences getSharedPreferencesHeight ;
SharedPreferences.Editor getEditoHeight ;
    double timeInSecond    ;
SharedPreferences sharedPreferencesGetGender ;
SharedPreferences.Editor editorGetGender;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_accurate_step_counter);
        buttonStop = (Button) findViewById(R.id.buttonSTOP);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        stepValue = (TextView) findViewById(R.id.step_value);
        distanceValue = (TextView) findViewById(R.id.distance_value);
        arrayList = new ArrayList<>();

        sharedPreferences = getSharedPreferences("saveInformation" , MODE_PRIVATE) ;
        sharedPreferencesFromSetting = getSharedPreferences("EmailSave" , MODE_PRIVATE);
        sharedPreferencesGetGender = getSharedPreferences("saveInformation" , MODE_PRIVATE);
   getSharedPreferencesHeight = getSharedPreferences("Height" , MODE_PRIVATE);

        distanceTitle = (TextView) findViewById(R.id.distance_title);



        gettingPersonHeightInDoule = Double.parseDouble(
                getSharedPreferencesHeight.getString("saveHeight" , "0"))/100;

        if (sharedPreferencesGetGender.getString("GENDER" , null).equals("Male") ){

            step_length = 0.415 * gettingPersonHeightInDoule ;

        }else {
            step_length = 0.413 * gettingPersonHeightInDoule ;

        }



        ToolbarConfig();
        MediaPlayer mediaPlayer1 = MediaPlayer.create(this , R.raw.boom);
        mediaPlayer1.start();

        registerForSensorEvents();
        onStopButtonClick();












        //  setupDetectorTimestampUpdaterThread();
    }

    @Override
    public void onBackPressed() {

    }

    public void onStopButtonClick () {


        buttonStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int actualSteps = getCurrentStepValue - arrayList.get(0);

                editor = sharedPreferences.edit() ;
                editor.putString("STEPS" , String.valueOf(actualSteps));

                editor.commit() ;






               startActivity(new Intent(AccurateStepCounter.this , FinalResultDisplay.class));

            }
        });

    }
    public void  ToolbarConfig () {
        toolbar.setTitle(getResources().getString(R.string.app_title));

        toolbar.setSubtitle("Pedometer");
        toolbar.setTitleTextColor(Color.WHITE);
        toolbar.setSubtitleTextColor(Color.WHITE);
        setSupportActionBar(toolbar);



    }

    public void registerForSensorEvents() {
        SensorManager sManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        // Step Counter
        sManager.registerListener(new SensorEventListener() {

                                      @Override
                                      public void onSensorChanged(SensorEvent event) {



                                          Step step = new Step(event.values[0], System.currentTimeMillis());

                                          arrayList.add(step);
                                          getCurrentStepValue = (int) step.getStep();

                                          stepValue.setText(getCurrentStepValue - arrayList.get(0) + "");

                                          double distaneCovered = step_length * (getCurrentStepValue - arrayList.get(0));

                                          // the elapsed time beetween 2 step will be:
                                          if (arrayList.size() > 2) {
                                              Step lastStep = arrayList.get(arrayList.size() - 1);
                                              Step previousStep = arrayList.get(arrayList.size() - 2);
                                              long msElapsedTime = lastStep.getTimestamp() - previousStep.getTimestamp();

                                              timeInSecond = TimeUnit.MILLISECONDS.toSeconds(msElapsedTime);


                                          }

                                          double getVelocity = distaneCovered / timeInSecond ;


                                          // distanceTitle shows the speed for now
                                            distanceTitle.setText(getVelocity + " m/s");
                                          distanceValue.setText("" + distaneCovered);








                                        /*  float steps = event.values[0];

                                          arrayList.add((int)steps);
                                          getCurrentStepValue = (int) steps ;


                                          double distanceCovered = (step_length * (getCurrentStepValue - arrayList.get(0))) /1000;


                                          stepValue.setText(getCurrentStepValue - arrayList.get(0) + "");
                                          distanceValue.setText("" + String.format("%.2f" , distanceCovered));*/


                                      }

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

                                      }
                                  }, sManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
                SensorManager.SENSOR_DELAY_FASTEST);
    }
}

  class Step {
    private float step;
    private long timestamp;



      Step (float step , long timestamp) {

          this.step = step;
          this.timestamp = timestamp ;

      }

      public void setStep(float step) {
          this.step = step;
      }

      public void setTimestamp(long timestamp) {
          this.timestamp = timestamp;
      }

      public float getStep() {
          return step;
      }

      public long getTimestamp() {
          return timestamp;
      }
      // getters

    // setters
}
public class Step {
    private float step;
    private long timestamp;

    // constructor

    // getters

    // setters
}


@Override
public void onSensorChanged(SensorEvent event) {
    Step step = new Step(event.values[0], System.currentTimeMillis());

    arrayList.add(step);
    getCurrentStepValue = (int) step.getStep();
    stepValue.setText(getCurrentStepValue - arrayList.get(0) + "");

    double distaneCovered = step_length * (getCurrentStepValue - arrayList.get(0));

    // the elapsed time beetween 2 step will be:
    if (arrayList.size() > 2) {
        Step lastStep = arrayList.get(arrayList.size() - 1);
        Step previousStep = arrayList.get(arrayList.size() - 2);
        long msElapsedTime = lastStep.getTimestamp() - previousStep.getTimestamp(); 
    }

    distanceValue.setText("" + distaneCovered);
}