2014-09-21 1 views
1

Я хочу получить текущее название города в моем приложении для Android, но, как в некоторых моих исследованиях (this, this и this), это довольно сложная задача и требует переключения между сетевыми провайдерами и выборкой обновления местоположения через некоторое время.Получить пользователя Текущий город в Android

Мое приложение не является приложением на основе местоположения, требующим точного и современного местоположения пользователя, использующего приложение. Мне просто нужно название города от NETWORK_PROVIDER (или любого другого поставщика, если на то пошло), но если он не может получить название города, это тоже нормально. Это всего лишь одна особенность приложения, и не имеет значения, не удалось ли получить имя города в .

Я использую следующий код, но он всегда показывает как latitude, так и longitude будет 0.0.

Location location = new Location(LocationManager.NETWORK_PROVIDER); 
Geocoder geocoder = new Geocoder(context, Locale.getDefault()); 
try { 
    Log.d("Lat-Lng", location.getLatitude()+","+location.getLongitude()); 
    // Doesn't really return anything as both latitude and longitude is 0.0. 
    List<Address> address = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); 
} catch(Exception e) { 

} 

ответ

0

Ну все, что вы здесь делаете, создает новый Location объект, начальные значения для широты и долготы равны нулю по умолчанию.

Что вам нужно сделать, это подключить это местоположение к GPS-информации пользователя.

// Getting LocationManager object from System Service LOCATION_SERVICE 
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

// Creating a criteria object to retrieve provider 
Criteria criteria = new Criteria(); 

// Getting the name of the best provider 
String provider = locationManager.getBestProvider(criteria, true); 

// Getting Current Location From GPS 
Location location = locationManager.getLastKnownLocation(provider); 

if(location != null) { 
    Log.d("Lat-Lng", location.getLatitude()+","+location.getLongitude()); 
    getUserGeoInfo(location.getLatitude(), location.getLongitude()); 
} 

// Define a listener that responds to location updates 
LocationListener locationListener = new LocationListener() { 

    public void onLocationChanged(Location location) { 
     // Called when a new location is found by the network location provider. 
     Log.d("Lat-Lng", location.getLatitude()+","+location.getLongitude()); 
     getUserGeoInfo(location.getLatitude(), location.getLongitude()); 
    } 

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

    public void onProviderEnabled(String provider) {} 

    public void onProviderDisabled(String provider) {} 
}; 

// Set how often you want to request location updates and where you want to receive them 
locationManager.requestLocationUpdates(provider, 20000, 0, locationListener); 

// ... 

void getUserGeoInfo(double lat, double lon) { 
    Geocoder geoCoder = new Geocoder(context, Locale.getDefault()); 
    if (Geocoder.isPresent()) { 
     List<Address> addresses = geoCoder.getFromLocation(lat, lon, 1); 
     if (addresses.size() > 0) { 
      // obtain all information from addresses.get(0) 
     } 
    } 
} 

Интерфейс LocationListener может, например, также может быть реализован Activity, который содержит этот код, а затем вы только передать контекст этой деятельности в качестве третьего параметра в locationManager.requestLocationUpdates(provider, 20000, 0, context);. Конечно, как и при любой реализации интерфейса, вам придется переопределить все методы так же, как в приведенном выше коде.

Что касается метода requestLocationUpdates(), вы можете read more about it here

Что касается общих методов получения местоположения пользователя на Android, this is a definite read

+0

Звучит довольно просто. Как реализовать «YOUR_LOCATION_LISTENER»? –

+0

ну, допустим, у вас есть 'Activity', объявленный как' class LocationActivity extends Activity', который содержит весь этот код. Просто поставьте 'LocationActivity extends Activity реализует LocationListener', и у вас будет доступ к методу' onLocationChanged'. Это означает, что в методе 'requestLocationUpdates' третьим параметром будет' this'. Узнайте больше об этом методе по ссылке, которую я предоставил, у нее много чего. – nem035

+0

@BasitSaeed, пожалуйста, прочитайте эту ссылку. http://developer.android.com/reference/android/location/LocationListener.html – SilentKiller