2015-05-14 3 views
2

Я до сих пор получаю текущее местоположение с GoogleApiClient, но я только что заметил, что это намного проще сделать с помощью LocationManager, используя LocationListener, поскольку он может даже обнаруживать, когда GPS-сервис был включен или выключен пользователем.Как получить начальное местоположение с помощью LocationManager?

Но у меня возникла проблема при получении первого местоположения пользователя после инициализации LocationManager.

LocationManager имеет 4 слушателей, но никто из них не дает вам вашего первого местоположения. У него есть слушатель onLocationChanged, но он активируется только при перемещении.

Это, как я использую его:

// Init LocationManager (needed to track if GPS is turned on or not 
locationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE); 
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 


end of oncreate...... 


/* 
LocationListener (Listening if GPS service is turned on/off) 
*/ 

@Override 
public void onProviderEnabled(String provider) { 
} 

@Override 
public void onLocationChanged(Location location) { 
} 

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

@Override 
public void onProviderDisabled(String provider) { 
} 

ответ

2

Используйте следующий метод, чтобы получить Location объект:

public Location getLocation() { 
    try { 
     locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 

     // getting GPS status 
     isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

     Log.v(TAG, "isGPSEnabled =" + isGPSEnabled); 

     // getting network status 
     isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     Log.v(TAG, "isNetworkEnabled =" + isNetworkEnabled); 

     this.canGetLocation = true; 
     if (isNetworkEnabled) { 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
      Log.d(TAG, "Network"); 
      if (locationManager != null) { 
       location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
       if (location != null) { 
        latitude = location.getLatitude(); 
        longitude = location.getLongitude(); 
       } 
      } 
     } 
     // if GPS Enabled get lat/long using GPS Services 
     if (isGPSEnabled && location == null) { 
      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
      Log.d(TAG, "GPS Enabled"); 
      if (locationManager != null) { 
       location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
       if (location != null) { 
        latitude = location.getLatitude(); 
        longitude = location.getLongitude(); 
       } 
      } 
     } 
    } catch (Exception e) { 
     Log.e(TAG, "Location Not Found"); 
    } 
    return location; 
} 

Для получения более подробной информации о методе getLastKnownLocation, пожалуйста refer to the docs.

+2

Нет, НИКОГДА НЕ используйте этот код. У этого есть тонна ошибок, в том числе это не всегда использование GPS, возможно возвращение устаревших данных или null, и это не всегда имеет место, даже если оно говорит, что это делает. См. Http://gabesechansoftware.com/location-tracking/ для полной записи –

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