Hej, piszę aplikację która obliczy przebyty dystans. Mam kod który wybiera bieżącą lokalizację co 10 sekund ale nie wiem jak zapisać starą lokalizację, aby zaimplementować (
do czterech punktów):
public double getDistance(double lat1, double lon1, double lat2, double lon2)
{
double latA = Math.toRadians(lat1);
double lonA = Math.toRadians(lon1);
double latB = Math.toRadians(lat2);
double lonB = Math.toRadians(lon2);
double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
(Math.sin(latA) * Math.sin(latB));
double ang = Math.acos(cosAng);
double dist = ang *6371;
return dist;
}
Miałem pomysł żeby co 10 sekund brało lokalizacje i po 5 sekundach w tej samej funkcji brało kolejną wartość i wtedy liczyło dystans z tych czterech, i dodało to do zmiennej "globalnej" distance ale nie mogę zrobić opóźnienia w funkcji na te kilka sekund bo cała funkcja się zatrzymuje i nie zbiera tych pierwszych wartości.
Dopiero uczę się javy, więc przepraszam za moje niezrozumienie. Od razu wybrałem się na "głęboką wodę", żeby zrealizować jeden projekt w mojej głowie.
Kod poniżej:
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Looper;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import android.os.Handler;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE_LOCATION_PERMISSION = 1;
private TextView textLatLong, distance;
private ProgressBar progressBar;
Handler handler = new Handler();
Runnable runnable;
int delay = 10000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textLatLong = findViewById(R.id.textLatLong);
distance = findViewById(R.id.distance);
progressBar = findViewById(R.id.progressBar);
findViewById(R.id.buttonGetCurrentLocation).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ContextCompat.checkSelfPermission(
getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
MainActivity.this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_CODE_LOCATION_PERMISSION
);
} else {
getCurrentLocation();
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_LOCATION_PERMISSION && grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getCurrentLocation();
} else {
Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onResume() {
handler.postDelayed(runnable = new Runnable() {
public void run() {
handler.postDelayed(runnable, delay);
getCurrentLocation();
}
}, delay);
super.onResume();
}
@Override
protected void onPause() {
handler.removeCallbacks(runnable); //stop handler when activity not visible super.onPause();
}
private void getCurrentLocation() {
progressBar.setVisibility(View.VISIBLE);
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(10000);
locationRequest.setFastestInterval(3000);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
LocationServices.getFusedLocationProviderClient(MainActivity.this)
.requestLocationUpdates(locationRequest, new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
LocationServices.getFusedLocationProviderClient(MainActivity.this)
.removeLocationUpdates(this);
if (locationResult != null && locationResult.getLocations().size() > 0) {
int latestLocationIndex = locationResult.getLocations().size() - 1;
double latitude = locationResult.getLocations().get(latestLocationIndex).getLatitude();
double longitude = locationResult.getLocations().get(latestLocationIndex).getLongitude();
textLatLong.setText(String.format("Latitude: %s\nLongitude: %s", latitude, longitude));
}
progressBar.setVisibility(View.GONE);
}
}, Looper.getMainLooper());
}