2013-02-11 144 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” :)

相关问题