2013-02-11 188 views
0

我的問題是獲取經度和緯度。當前位置,經度和緯度

在模擬器中我使用:Lat - 54.035795,Long - 21.760029。但是,當我打電話getLatitude()getLongitude()我得到54.0和21.0。
所以我無法獲得兩點之間的準確距離。 問題是什麼?

請幫幫我。

public final class LocationGpsListener implements LocationListener 
{ 

     private final Context mContext; 
     public boolean isGPSEnabled = false; 
     boolean isNetworkEnabled = false; 
     boolean canGetLocation = false; 

     Location location; 
     Double latitude; 
     Double longitude; 

     private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; 
     private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; 

     protected LocationManager locationManager; 

     public LocationGpsListener(Context context) { 
      this.mContext = context; 
      getLocation(); 
     } 

     public Location getLocation() { 
      try { 
       locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 
       isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
       Log.v("isGPSEnabled", "=" + isGPSEnabled); 

       isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
       Log.v("isNetworkEnabled", "=" + isNetworkEnabled); 

       if (isGPSEnabled == false && isNetworkEnabled == false) { 

       } else { 
        this.canGetLocation = true; 
        if (isNetworkEnabled) { 
         locationManager.requestLocationUpdates(
           LocationManager.NETWORK_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
         if (locationManager != null) { 
          location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
          if (location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
          } 
         } 
        } 
        if (isGPSEnabled) { 
         if (location == null) { 
          locationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 
            MIN_TIME_BW_UPDATES, 
            MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
          Log.d("GPS Enabled", "GPS Enabled"); 
          if (locationManager != null) { 
           location = locationManager 
             .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
           if (location != null) { 
            latitude = location.getLatitude(); 
            longitude = location.getLongitude(); 
           } 
          } 
         } 
        } 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      return location; 
     } 

     public void stopUsingGPS() { 
      if (locationManager != null) { 
       locationManager.removeUpdates(LocationGpsListener.this); 
      } 
     } 

     public double getLatitude() { 
      if (location != null) { 
       latitude = location.getLatitude(); 
      } 
      return latitude; 
     } 

     public double getLongitude() { 
      if (location != null) { 
       longitude = location.getLongitude(); 
      } 
      return longitude; 
     } 

     public boolean canGetLocation() { 
      return this.canGetLocation; 
     } 

     public void showSettingsAlert() { 
      AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

      alertDialog.setTitle("GPS"); 
      alertDialog.setMessage("GPS is ENABLED:"); 

      alertDialog.setPositiveButton("Settings", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          Intent intent = new Intent(
            Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
          mContext.startActivity(intent); 
         } 
        }); 

      alertDialog.setNegativeButton("Cancel", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          dialog.cancel(); 
         } 
        }); 
      alertDialog.show(); 
     } 

     @Override 
     public void onLocationChanged(Location location) { 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
     } 

} 

我用:

mGPS = new LocationGpsListener(this); 

if(mGPS.canGetLocation){ 

    longitude = mGPS.getLatitude(); 
    latitude = mGPS.getLongitude();   
}else{ 
    longitude = 21.230000; 
    latitude = 53.230000; 
} 

Location l1 = new Location("lok a"); 
l1.setLatitude(latitude); 
l1.setLongitude(longitude); 

Location l2 = new Location("lok b"); 
l2.setLatitude(54.035679); 
l2.setLongitude(21.784879);        

回答

0

我無法重現您的問題,但是我可以用你的代碼的改進版本,爲您提供:

import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

public final class LocationGpsListener implements LocationListener { 

    public boolean isGPSEnabled = false; 

    private Location location; 

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; 

    protected LocationManager locationManager; 

    public LocationGpsListener(Context context) { 
     locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
     // TODO check is network/gps is enabled and display the system settings 
     // see 
     // https://github.com/unchiujar/Umbra/blob/master/src/main/java/org/unchiujar/umbra/activities/FogOfExplore.java#L599 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
       MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, 
       MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

     location = new Location("fake"); 
     location.setLatitude(0); 
     location.setLongitude(0); 
    } 

    public void stopLocationUpdates() { 
     if (locationManager != null) { 
      locationManager.removeUpdates(LocationGpsListener.this); 
     } 
    } 

    public double getLatitude() { 
     return location.getLatitude(); 
    } 

    public double getLongitude() { 
     return location.getLongitude(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     this.location = location; 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // NO-OP 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // NO-OP 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // NO-OP 
    } 

} 

您發佈的代碼不正確使用偵聽程序模式(我的也不是,但這是一個改進)。位置邏輯應該在onLocationChanged方法中,而不是在別處的隨機方法中。在

我建議你閱讀:http://www.vogella.com/articles/AndroidLocationAPI/article.html

另外,不要使用catch(Exception e)它會導致所有排序非常難以跟蹤的錯誤。 Why is the Catch(Exception) almost always a bad Idea? http://today.java.net/article/2006/04/04/exception-handling-antipatterns#catchingException

+0

TNX ,但我有更大的問題:( – Unmerciful 2013-02-11 16:23:12

+0

我沒有提到它,但我發佈的代碼應該修復你的問題:) – 2013-02-11 16:50:55

+0

你在哪裏設置位置? – Unmerciful 2013-02-11 17:06:35

0

我認爲問題是,你不是與使用的位置提供足夠具體,你要回場的精度。

locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 
Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_HIGH); 
locationManager.getBestProvider(criteria, true); 

或也許選擇使用的requestLocationUpdates該取標準作爲參數的控制裝置:

使用Criteria設置所需的精度獲得最佳位置提供。

檢查上面的內容,並在清單中也有"android.permission.ACCESS_FINE_LOCATION"

0

我的問題是在獲得位置befor我的GPS設置好值

而且我有一個有趣的問題(當應用程序崩潰): 「記住,檢查設備是否具有GPS」 :)

相關問題