Рассчитайте скорость перемещения пользователя в Android Studio
Мне нужно рассчитать скорость, с которой движется пользователь. Поэтому для расчета скорости нам нужны две вещи: GPS и акселерометр.
Но у обоих есть свои ограничения.
GPS не доступен все время. Пока я получаю текущее местоположение пользователя, я всегда получаю только от провайдера сети, а не от GPS.
Акселерометр не точный.
Так какой подход я должен пойти с?
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();
}
}
}
}