我怎么能得到我目前职位的城市名称?

我正在使用android studio并在一个popup式对话框中,我想用户可以获得他们的位置,但我知道要做的就是得到我的经纬度。

这是代码

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你帮帮我?

我在清单中添加了这个

    

但它仍然说“位置不可用”。


您需要GeoCoder类才能从给定的Lat / Long获取地址 。 尝试以下方法:

 Geocoder geoCoder = new Geocoder(this, Locale.getDefault()); //it is Geocoder StringBuilder builder = new StringBuilder(); try { List
address = geoCoder.getFromLocation(latitude, longitude, 1); int maxLines = address.get(0).getMaxAddressLineIndex(); for (int i=0; i

下面的代码应该适合您:(检查有关您的代码的内联注释)

 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 = geoCoder.getFromLocation(lat, lng, 1); int maxLines = address.get(0).getMaxAddressLineIndex(); for (int i=0; i

您需要在AysncTask (或不在与UI线程相同的ThreadGroup中的线程中)执行Geocoder!

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

有了这个抽象的监听器

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

现在调用这样的方法:

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

希望这会对你们有些帮助!

您可以使用google api获取当前位置地址。 在这篇文章中查看我的答案去获取你的城市。

如何从谷歌地图中的纬度和经度坐标获取城市名称?