2013-05-20 124 views
1

在我的應用程序中,我試圖使計算人員走過的距離成爲可能。爲此,我創建了一個LocationHelper類,它應該每30秒或10米爲我提供當前的GeoPoint。我已經有了一種方法,可以返回我知道可用的兩個GeoPoint之間的距離,因爲我已經在之前的項目中使用了它。我還有一個名爲WalkActivity的Activity,我在LocationHelper中調用方法getDistance(),並將其顯示在TextView中,該TextView在計時器的幫助下每30秒更新一次。見下面的代碼。使用GeoPoint測量距離並顯示到用戶的距離

當我運行我的應用程序時,沒有顯示任何內容。它說「你走了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

的一個問題是,當你從一個onLocationChanged(Location location)創建Location一個GeoPoint。來自類LocationgetLatitude()getLongitude()返回度,但GeoPoint的構造函數取微分。這可能會導致你的距離計算,因爲你的GeoPoint座標可能是,我們只是說,42度,這在GeoPoint,結果是0.0000042度。

此外,您可能嘗試以某種方式打印當前位置,通過調試監視器或通過Toast消息。這在調試過程中會有很大的幫助,因爲您可以看到您的Lat/Long更改和調試。

注:我會建議更新到地圖V2,他們改變了很多類,並添加LatLng這使得事情更容易理解:)

+0

哦,感謝您的幫助! 我把getLatitude()和(deg * 1E6)相乘,現在走了大概50米後,等了1分鐘,我得到了「你已經走了6520332.95米......到目前爲止」。所以這感覺像是一種改進,但顯然有些東西還是錯的!我會接受你的建議,並試圖找出如何以某種方式打印當前位置! – Elisabeth

+0

很高興它的工作!一定要讓我知道,如果一切順利! – crocboy

+0

哦,不,我的不好!我忘了把其中一個變量放大。它現在有效!萬分感謝! – Elisabeth