android - recorridos - Usar gps para obtener la distancia que una persona ha caminado
app para medir distancia recorrida en bicicleta (3)
chicos, puedo obtener la longitud de ubicación actual y Latitude usando el siguiente código. Tengo dos botones Start walking and Stop Walking.
Al hacer clic en Start Walking
obtendrá la ubicación actual (longitud y latitud) la persona comenzará a caminar desde la posición A (fuente) y caminará desde algún momento y regresará a A (ahora se convierte en destino), luego hará clic en detener caminando botón.
Ahora necesito mostrarle al usuario estos detalles:
1.Distancia de que él caminó en Kms.
2. Tiempo que tomó en minutos.
(opcional) 3.velocidad o velocidad promedio.
**
Código para obtener la ubicación actual
**
private EditText editTextShowLocation;
private Button buttonGetLocation;
private ProgressBar progress;
private LocationManager locManager;
private LocationListener locListener = new MyLocationListener();
private boolean gps_enabled = false;
private boolean network_enabled = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editTextShowLocation = (EditText) findViewById(R.id.editTextShowLocation);
progress = (ProgressBar) findViewById(R.id.progressBar1);
progress.setVisibility(View.GONE);
buttonGetLocation = (Button) findViewById(R.id.buttonGetLocation);
buttonGetLocation.setOnClickListener(this);
locManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
}
@Override
public void onClick(View v) {
progress.setVisibility(View.VISIBLE);
// exceptions will be thrown if provider is not permitted.
try {
gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
}
try {
network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch (Exception ex) {
}
// don''t start listeners if no provider is enabled
if (!gps_enabled && !network_enabled) {
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("Attention!");
builder.setMessage("Sorry, location is not determined. Please enable location providers");
builder.setPositiveButton("OK", this);
builder.setNeutralButton("Cancel", this);
builder.create().show();
progress.setVisibility(View.GONE);
}
if (gps_enabled) {
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
}
if (network_enabled) {
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
}
}
class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
if (location != null) {
// This needs to stop getting the location data and save the battery power.
locManager.removeUpdates(locListener);
String londitude = "Londitude: " + location.getLongitude();
String latitude = "Latitude: " + location.getLatitude();
String altitiude = "Altitiude: " + location.getAltitude();
String accuracy = "Accuracy: " + location.getAccuracy();
String time = "Time: " + location.getTime();
editTextShowLocation.setText(londitude + "/n" + latitude + "/n" + altitiude + "/n" + accuracy + "/n" + time);
progress.setVisibility(View.GONE);
}
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
@Override
public void onClick(DialogInterface dialog, int which) {
if(which == DialogInterface.BUTTON_NEUTRAL){
editTextShowLocation.setText("Sorry, location is not determined. To fix this please enable location providers");
}else if (which == DialogInterface.BUTTON_POSITIVE) {
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
}
Cómo lograr esto
Ante todo. Esto es más que una pregunta sobre un problema y luego recibirá una respuesta. Las personas en este foro no te harán trabajar para ti.
Ahora a una manera de lograr lo que quieres.
Debe usar un servicio para realizar un seguimiento del usuario y las ubicaciones. La manera más fácil sería incorporar el servicio mytracks que está disponible como complemento de su aplicación o usar código de mytracks para crear su propio servicio de seguimiento. http://code.google.com/p/mytracks/
Puede consultar: http://code.google.com/p/mytracks/w/list
prueba esto
public class TestActivity extends Activity implements Runnable {
private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
private static final long MINIMUM_TIME_BETWEEN_UPDATES = 30000;
protected LocationManager locationManager;
static double n=0;
Long s1,r1;
double plat,plon,clat,clon,dis;
MyCount counter;
Thread t1;
EditText e1;
boolean bool=true;
Button b1,b2,b3,b4,b5;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b1=(Button)findViewById(R.id.button1);<--- current position
b2=(Button)findViewById(R.id.button2);<---- start moving.. calculates distance on clicking this
b3=(Button)findViewById(R.id.button3);<--- pause
b4=(Button)findViewById(R.id.button4);<-- resume
b5=(Button)findViewById(R.id.button5);<-- get distance
e1=(EditText)findViewById(R.id.editText1);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MINIMUM_TIME_BETWEEN_UPDATES,
MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
new MyLocationListener()
);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showCurrentLocation();
}
});
}
protected void showCurrentLocation() {
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
String message = String.format(
"Current Location /n Longitude: %1$s /n Latitude: %2$s",
location.getLongitude(), location.getLatitude()
);
clat=location.getLatitude();
clon=location.getLongitude();
Toast.makeText(TestActivity.this, message,
Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(TestActivity.this, "null location",
Toast.LENGTH_LONG).show();
}
}
public void start (View v){
switch(v.getId()){
case R.id.button2:
t1=new Thread();
t1.start();
counter= new MyCount(30000,1000);
counter.start();
break;
case R.id.button3:
counter.cancel();
bool=false;
break;
case R.id.button4:
counter= new MyCount(s1,1000);
counter.start();
bool=true;
break;
case R.id.button5:
double time=n*30+r1;
Toast.makeText(TestActivity.this,"distance in metres:"+String.valueOf(dis)+"Velocity in m/sec :"+String.valueOf(dis/time)+"Time :"+String.valueOf(time),Toast.LENGTH_LONG).show();
}
}
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location location) {
String message = String.format(
"New Location /n Longitude: %1$s /n Latitude: %2$s",
location.getLongitude(), location.getLatitude()
);
Toast.makeText(TestActivity.this, message, Toast.LENGTH_LONG).show();
}
public void onStatusChanged(String s, int i, Bundle b) {
Toast.makeText(TestActivity.this, "Provider status changed",
Toast.LENGTH_LONG).show();
}
public void onProviderDisabled(String s) {
Toast.makeText(TestActivity.this,
"Provider disabled by the user. GPS turned off",
Toast.LENGTH_LONG).show();
}
public void onProviderEnabled(String s) {
Toast.makeText(TestActivity.this,
"Provider enabled by the user. GPS turned on",
Toast.LENGTH_LONG).show();
}
}
public class MyCount extends CountDownTimer{
public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
counter= new MyCount(30000,1000);
counter.start();
n=n+1;
}
@Override
public void onTick(long millisUntilFinished) {
s1=millisUntilFinished;
r1=(30000-s1)/1000;
e1.setText(String.valueOf(r1));
}
}
@Override
public void run() {
while(bool){
clat=location.getLatitude();
clon=location.getLongitude();
if(clat!=plat || clon!=plon){
dis+=getDistance(plat,plon,clat,clon);
plat=clat;
plon=clon;
}
}
}
función para calcular la distancia ...
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;
}
}
Puede calcular la distancia entre dos ubicaciones geográficas con la función distanceTo ()
Location destination =new Location("gps");
destination.setLatitude(lat);
destination.setLongitude(lng);
float dist=user_location.distanceTo(destination);