Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how I can get the city name of my current position?

Tags:

I'm working with android studio and in a popup dialog I want that users can get their position but all I know to do is get my latitude and longitude.

This is the code

import android.app.Activity; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast;  public class MainActivity extends Activity implements LocationListener {     private TextView latituteField;     private TextView longitudeField;     private LocationManager locationManager;     private String provider;       @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         latituteField = (TextView) findViewById(R.id.TextView02);         longitudeField = (TextView) findViewById(R.id.TextView04);           locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);          Criteria criteria = new Criteria();         provider = locationManager.getBestProvider(criteria, false);         Location location = locationManager.getLastKnownLocation(provider);           if (location != null) {             System.out.println("Provider " + provider + " has been selected.");             onLocationChanged(location);         } else {             latituteField.setText("Location not available");             longitudeField.setText("Location not available");         }     }       @Override     protected void onResume() {         super.onResume();         locationManager.requestLocationUpdates(provider, 400, 1, this);     }       @Override     protected void onPause() {         super.onPause();         locationManager.removeUpdates(this);     }      @Override     public void onLocationChanged(Location location) {         int lat = (int) (location.getLatitude());         int lng = (int) (location.getLongitude());         latituteField.setText(String.valueOf(lat));         longitudeField.setText(String.valueOf(lng));     }      @Override     public void onStatusChanged(String provider, int status, Bundle extras) {       }      @Override     public void onProviderEnabled(String provider) {         Toast.makeText(this, "Enabled new provider " + provider,                 Toast.LENGTH_SHORT).show();      }      @Override     public void onProviderDisabled(String provider) {         Toast.makeText(this, "Disabled provider " + provider,                 Toast.LENGTH_SHORT).show();     } }  

in the MainActivity.Can you help me?

I've added this in the manifest

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/> 

but it still says "Location not available".


like image 655
Rick Avatar asked Aug 14 '13 01:08

Rick


People also ask

How can I get current location?

There are two ways to get the current location of any Android device: Android's Location Manager API. Fused Location Provider: Google Play Services Location APIs.


2 Answers

You need the GeoCoder class to get Address from a given Lat/Long. try the following:

Geocoder geoCoder = new Geocoder(this, Locale.getDefault()); //it is Geocoder StringBuilder builder = new StringBuilder(); try {     List<Address> address = geoCoder.getFromLocation(latitude, longitude, 1);     int maxLines = address.get(0).getMaxAddressLineIndex();     for (int i=0; i<maxLines; i++) {     String addressStr = address.get(0).getAddressLine(i);     builder.append(addressStr);     builder.append(" ");     }  String fnialAddress = builder.toString(); //This is the complete address. } catch (IOException e) {}   catch (NullPointerException e) {} 

Code below should work for you: (Check the inline comments regarding your code)

import java.io.IOException; import java.util.List; import java.util.Locale;  import android.app.Activity; import android.content.Context; import android.location.Address; import android.location.Criteria; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast;  public class MainActivity extends Activity implements LocationListener { private TextView latituteField; private TextView longitudeField; private TextView addressField; //Add a new TextView to your activity_main to display the address private LocationManager locationManager; private String provider;   @Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     latituteField = (TextView) findViewById(R.id.TextView02);     longitudeField = (TextView) findViewById(R.id.TextView04);     addressField = (TextView) findViewById(R.id.TextView05); //Make sure you add this to activity_main       locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);      Criteria criteria = new Criteria();     provider = locationManager.getBestProvider(criteria, false);     Location location = locationManager.getLastKnownLocation(provider);       if (location != null) {         System.out.println("Provider " + provider + " has been selected.");         onLocationChanged(location);     } else {         latituteField.setText("Location not available");         longitudeField.setText("Location not available");     } }   @Override protected void onResume() {     super.onResume();     locationManager.requestLocationUpdates(provider, 400, 1, this); }   @Override protected void onPause() {     super.onPause();     locationManager.removeUpdates(this); }  @Override public void onLocationChanged(Location location) {     //You had this as int. It is advised to have Lat/Loing as double.     double lat = location.getLatitude();     double lng = location.getLongitude();      Geocoder geoCoder = new Geocoder(this, Locale.getDefault());     StringBuilder builder = new StringBuilder();     try {         List<Address> address = geoCoder.getFromLocation(lat, lng, 1);         int maxLines = address.get(0).getMaxAddressLineIndex();         for (int i=0; i<maxLines; i++) {             String addressStr = address.get(0).getAddressLine(i);             builder.append(addressStr);             builder.append(" ");         }          String fnialAddress = builder.toString(); //This is the complete address.          latituteField.setText(String.valueOf(lat));         longitudeField.setText(String.valueOf(lng));         addressField.setText(fnialAddress); //This will display the final address.      } catch (IOException e) {         // Handle IOException     } catch (NullPointerException e) {         // Handle NullPointerException     } }  @Override public void onStatusChanged(String provider, int status, Bundle extras) {   }  @Override public void onProviderEnabled(String provider) {     Toast.makeText(this, "Enabled new provider " + provider,             Toast.LENGTH_SHORT).show();  }  @Override public void onProviderDisabled(String provider) {     Toast.makeText(this, "Disabled provider " + provider,             Toast.LENGTH_SHORT).show(); } } 
like image 146
gsb Avatar answered Nov 19 '22 13:11

gsb


You need to execute the Geocoder in a AsyncTask (or in a Thread not in the same ThreadGroup as the UI Thread)!

public void getCityName(final Location location, final OnGeocoderFinishedListener listener) {    new AsyncTask<Void, Integer, List<Address>>() {       @Override       protected List<Address> doInBackground(Void... arg0) {          Geocoder coder = new Geocoder(getContext(), Locale.ENGLISH);          List<Address> results = null;          try {             results = coder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);          } catch (IOException e) {             // nothing          }          return results;       }                @Override       protected void onPostExecute(List<Address> results) {          if (results != null && listener != null) {             listener.onFinished(results);          }       }    }.execute(); } 

With this abstract Listener

public abstract class OnGeocoderFinishedListener {    public abstract void onFinished(List<Address> results); } 

Now call the method like this:

getCityName(location, new OnGeocoderFinishedListener() {    @Override    public void onFinished(List<Address> results) {       // do something with the result    } }); 

Hope this will help some of you!

like image 45
Kai Burghardt Avatar answered Nov 19 '22 13:11

Kai Burghardt