在我的应用程序中,我试图计算一个人走路的距离。为此,我创建了一个LocationHelper类,它应该每隔30秒或10米让我获得当前的GeoPoint。我已经有一个方法可以返回我知道有效的两个GeoPoints之间的距离,因为我在以前的项目中使用过它。我还有一个名为WalkActivity的Activity,我在LocationHelper中调用方法getDistance()并将其显示在TextView中,该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();
}
}
答案 0 :(得分:1)
代码中的一个问题是当您从GeoPoint
中的Location
创建onLocationChanged(Location location)
时。类getLatitude()
中的getLongitude()
和Location
都返回度,但GeoPoint
的构造函数需要微度。这可能会搞砸你的距离计算,因为你的GeoPoint
坐标可以说是42度,GeoPoint
的结果是.0000042度。
此外,您可以尝试通过调试监视器或Toast
消息以某种方式打印当前位置。这将有助于调试过程,因为您可以从那里看到Lat / Long更改和调试。
注意:我建议更新到地图v2,他们更改了很多课程并添加了LatLng
,这使事情更容易理解:)