Рассчитайте скорость перемещения пользователя в Android Studio

Мне нужно рассчитать скорость, с которой движется пользователь. Поэтому для расчета скорости нам нужны две вещи: GPS и акселерометр.

Но у обоих есть свои ограничения.

  1. GPS не доступен все время. Пока я получаю текущее местоположение пользователя, я всегда получаю только от провайдера сети, а не от GPS.

  2. Акселерометр не точный.

Так какой подход я должен пойти с?

2 ответа

Акселерометр не надежен, на данный момент вы можете попробовать его протестировать и настроить в соответствии с вашими требованиями.

Проверьте здесь:

https://github.com/bagilevi/android-pedometer

Одна из многих особенностей:

рассчитать расстояние и скорость на основе длины шага пользователя

Попробуйте описанный ниже способ узнать скорость движения с помощью GPS.

      public class MainActivity extends AppCompatActivity {

    TextView textView;
    private FusedLocationProviderClient mFusedLocationClient;
    private double lat;
    private double lng;
    private static int UPDATE_INTERVAL = 1000;
    private static int FATEST_INTERVAL = 1000;
    private static int DISPLACEMENT = 0;
    private double speed = 0.0;
    double currentSpeed,kmphSpeed;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        textView = findViewById(R.id.textView);
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!runtime_permissions()) {
            requestLocations();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        //stop location updates when Activity is no longer active
        if (mFusedLocationClient != null) {
            mFusedLocationClient.removeLocationUpdates(mLocationCallback);
        }
    }

    @SuppressLint("MissingPermission")
    private void requestLocations() {
        LocationRequest mLocationRequest = new LocationRequest();
//        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        mLocationRequest.setInterval(UPDATE_INTERVAL);
        mLocationRequest.setFastestInterval(FATEST_INTERVAL);
        mLocationRequest.setSmallestDisplacement(DISPLACEMENT);

        mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
    }

    LocationCallback mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            List<Location> locationList = locationResult.getLocations();
            if (locationList.size() > 0) {
                //The last location in the list is the newest
                Location location = locationList.get(locationList.size() - 1);
                Location location2 = locationResult.getLastLocation();
                lat = location.getLatitude();
                lng = location.getLongitude();

                speed = location.getSpeed();
                currentSpeed = round(speed,3,BigDecimal.ROUND_HALF_UP);
                kmphSpeed = round((currentSpeed*3.6),3,BigDecimal.ROUND_HALF_UP);

                //speed in km/h
//                speed = (int) ((location.getSpeed() * 3600) / 1000);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("speed=== "+speed+"\ncurrentspeed==="+currentSpeed+"\nkmph speed === "+kmphSpeed);
                    }
                });
//                Log.i("SensorTestActivity","SPEEDDDDDspeed=== "+speed+"     ");
            }
        }
    };

    public static double round(double unrounded, int precision, int roundingMode) {
        BigDecimal bd = new BigDecimal(unrounded);
        BigDecimal rounded = bd.setScale(precision, roundingMode);
        return rounded.doubleValue();
    }

    private boolean runtime_permissions() {
        if (Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 100);

            return true;
        }
        return false;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                onResume();
            } else {
                runtime_permissions();
            }
        }
    }
}
Другие вопросы по тегам