Измерьте пройденное расстояние с помощью GeoPoint и отобразите расстояние до пользователя
В моем приложении я пытаюсь рассчитать расстояние, которое проходит человек. Для этого я создал класс LocationHelper, который должен получать текущую GeoPoint каждые 30 секунд или 10 метров. У меня уже есть метод, который возвращает расстояние в метрах между двумя GeoPoints, которое я знаю, работает, потому что я использовал его в предыдущем проекте. У меня также есть Activity под названием WalkActivity, где я вызываю метод getDistance() в LocationHelper и отображаю его в TextView, который обновляется каждые 30 секунд с помощью таймера. Смотрите код ниже.
Когда я запускаю свое приложение, ничего не отображается. Там написано "Вы прошли 0,0 метров", независимо от того, как далеко я иду. Я не получаю сообщений об ошибках. Что ты думаешь я делаю не так? Я искал и смотрел на многочисленные примеры, но не нашел ни одного, который мог бы сказать мне, что здесь не так.
Я надеюсь, что это не глупый вопрос, любая помощь приветствуется:)
package Controller;
import com.google.android.maps.GeoPoint;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
/**
* Location Helper Class that handles creation of the Location Manager and Location Listener.
*
*/
public class LocationHelper{
private double distance = 0;
GeoPoint geoPointA;
GeoPoint geoPointB;
//location manager and listener
private LocationManager locationManager;
private MyLocationListener locationListener;
/**
* Constructor for LocationHelper
*
* @param context - The context of the calling activity.
*/
public LocationHelper(Context context){
//setup the location manager
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
//create the location listener
locationListener = new MyLocationListener();
//setup a callback for when the GPS gets a lock and we receive data
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 10, locationListener);
}
/**
* Receiving notifications from the Location Manager when they are sent.
*
*/
public class MyLocationListener implements LocationListener {
/**
* called when the location service reports a change in location
*/
public void onLocationChanged(Location location) {
if (geoPointB == null){
geoPointB = new GeoPoint((int) location.getLatitude(), (int) location.getLongitude());
}
//Getting the current GeoPoint.
geoPointA = new GeoPoint((int) location.getLatitude(), (int) location.getLongitude());
//Calculating the distance in meters
distance = distance + nu.placebo.whatsup.util.Geodetics.distance(geoPointA, geoPointB);
//Making current GeoPoint the previous GeoPoint
geoPointB = geoPointA;
}
//called when the provider is disabled
public void onProviderDisabled(String provider) {}
//called when the provider is enabled
public void onProviderEnabled(String provider) {}
//called when the provider changes state
public void onStatusChanged(String provider, int status, Bundle extras) {}
}
/**
* Stop updates from the Location Service.
*/
public void killLocationServices(){
locationManager.removeUpdates(locationListener);
}
/**
* Get Distance
*
* @return - The current distance walked.
*/
public double getDistance(){
return distance;
}
/**
* Check if a location has been found yet.
* @return - True if a location has been acquired. False otherwise.
*/
public Boolean gpsEnabled(){
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
}
package edu.chl.dat255.sofiase.readyforapet;
import java.util.Timer;
import java.util.TimerTask;
import Controller.LocationHelper;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class WalkActivity extends Activity{
private TextView displayDistance;
private int delay = 0;
private int period = 30000;
private Timer timer;
Handler handler = new Handler();
private LocationHelper location;
/**
* On Create method
*
* @param savedInstanceState - bundle
*/
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView(R.layout.walkactivity);
location = new LocationHelper(this);
//Checking if the GPS is enabled, else let the user start GPS if wanted.
if (location.gpsEnabled()){
Toast.makeText(this, "GPS is Enabled on your devide", Toast.LENGTH_SHORT).show();
}
else{
showGPSDisabledAlert();
}
Button startWalking = (Button) findViewById(R.id.startwalking);
startWalking.setOnClickListener(new OnClickListener() {
/**
* Method onClick for the start walking button
*
* @param v - View
*/
public void onClick (View v){
try{
timer = new Timer();
timer.schedule(myTimerTask, delay, period);
}
catch (Exception e){
e.printStackTrace();
}
}
}
);
Button stopWalking = (Button) findViewById(R.id.stopwalking);
stopWalking.setOnClickListener(new OnClickListener() {
/**
* Method onClick for the stop walking button
*
* @param v - View
*/
public void onClick (View v){
timer.cancel();
location.killLocationServices();
startActivity(new Intent(WalkActivity.this, PetActivity.class));
}
}
);
}
TimerTask myTimerTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
displayDistance = (TextView) findViewById(R.id.distance);
displayDistance.setText("You have walked " + location.getDistance() + " meters so far.");
}
});
}
};
/**
* If GPS is turned off, lets the user either choose to enable GPS or cancel.
*
*/
private void showGPSDisabledAlert(){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage("GPS is disabled on your device. Would you like to enable it?")
.setCancelable(false)
.setPositiveButton("Go to Settings Page To Enable GPS",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
Intent callGPSSettingIntent = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(callGPSSettingIntent);
}
});
alertDialogBuilder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
dialog.cancel();
}
});
AlertDialog alert = alertDialogBuilder.create();
alert.show();
}
}
1 ответ
Одна проблема в вашем коде, когда вы создаете GeoPoint
из Location
в onLocationChanged(Location location)
, И то и другое getLatitude()
а также getLongitude()
из класса Location
вернуть градусы, но конструктор для GeoPoint
принимает микродеграды Это может испортить ваш расчет расстояния, потому что ваш GeoPoint
координаты могут быть, скажем так, 42 градуса, что в.0000042 градусов в GeoPoint
,
Кроме того, вы можете попытаться распечатать текущее местоположение как-нибудь, через монитор отладки или через Toast
сообщение. Это очень поможет в процессе отладки, так как вы можете увидеть, как ваш Lat/Long меняется и отлаживается оттуда.
Примечание: я бы порекомендовал обновить до Maps v2, они изменили много классов и добавили LatLng
что делает вещи проще для понимания:)