如何获得当前职位的城市名称?
Posted
技术标签:
【中文标题】如何获得当前职位的城市名称?【英文标题】:how I can get the city name of my current position? 【发布时间】:2013-08-15 19:23:59 【问题描述】:我正在使用 android studio,在一个弹出对话框中我希望用户可以获取他们的位置,但我所知道的只是获取我的纬度和经度。
这是代码
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。你能帮帮我吗?
我已经在清单中添加了这个
<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"/>
但它仍然显示“位置不可用”。
【问题讨论】:
你的名字是指地址? 是的,我指的是城市:例如。佛罗伦萨 【参考方案1】:您需要 GeoCoder 类从给定的经纬度获取 Address。尝试以下方法:
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)
下面的代码应该适合您:(检查有关您的代码的内联 cmets)
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();
【讨论】:
我不知道为什么,但它不起作用!当我在手机上启动该应用程序时,它显示“不幸的是,我的应用程序已停止”。它对你有用吗? Nono 我解决了它并且它工作但在 TextView02、TextView04 和 TextView05 中显示“位置不可用” 你是在设备还是模拟器上使用它? 我在手机上试试 System.err: java.io.IOException: 服务不可用【参考方案2】:您需要在 AsyncTask 中(或在与 UI 线程不同的 ThreadGroup 中的线程中)执行 Geocoder!
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
);
希望这会对你们中的一些人有所帮助!
【讨论】:
【参考方案3】:您可以使用 google api 获取当前位置地址。看看我在这篇文章中的回答去获取你的城市吧。
How to get city name from latitude and longitude coordinates in Google Maps?
【讨论】:
以上是关于如何获得当前职位的城市名称?的主要内容,如果未能解决你的问题,请参考以下文章