Как я могу получить название моего нынешнего места?

Я работаю с андроид-студией, и во всплывающем диалоге я хочу, чтобы пользователи могли получить свою позицию, но все, что я знаю, это получить мою широту и долготу.

Это код

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(); } } 

В MainActivity.Can вы поможете мне?

Я добавил это в манифест

 <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"/> 

Но он все еще говорит «Место недоступно».


Вам нужен класс GeoCoder для получения адреса от заданного Lat / Long. Попробуйте следующее:

 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) {} 

Код ниже должен работать для вас: (проверьте встроенные комментарии относительно вашего кода)

 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(); } } 

Вам необходимо выполнить Geocoder в AysncTask (или в потоке, который не входит в ту же ThreadGroup, что и поток пользовательского интерфейса)!

 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(); } 

С помощью этого абстрактного прослушивателя

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

Теперь вызовите метод следующим образом:

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

Надеюсь, это поможет некоторым из вас!

Вы можете использовать google api для получения текущего адреса местоположения. Посмотрите мой ответ в этом посте, идите в свой город.

Как получить название города из координат широты и долготы в Картах Google?