2013-02-11 3 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

+0

Я не упоминал об этом, но код, который я опубликовал, должен исправить вашу проблему :) –

+0

Где вы здесь устанавливаете местоположение? – Unmerciful

0

Я думаю, что проблема в том, что вы не достаточно специфический с провайдера местоположения, используемого, и вы получаете обратный курс точности.

Получит лучший поставщик местоположения с помощью Criteria установить точность:

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

или, возможно, в качестве альтернативы использовать переопределение requestLocationUpdates, который принимает критерии в качестве параметра.

Проверьте вышеуказанное, а также укажите "android.permission.ACCESS_FINE_LOCATION" в своем манифесте.

0

Моя проблема была в получении Место Befor мой GPS установлено хорошее значение

И у меня была одна смешная проблема (если приложение разбился): «Помните, проверьте, есть ли устройство с GPS» :)

Смежные вопросы