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".
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.
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(); } }
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With