android获取当前位置名称
Posted
技术标签:
【中文标题】android获取当前位置名称【英文标题】:android get current location name 【发布时间】:2012-03-05 10:44:49 【问题描述】:我想用名字获取当前位置。我为获取当前位置(纬度,语言)进行了编码,如何显示相对地名?
(即)13.006389 - 80.2575:印度钦奈阿迪亚尔
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener()
public void onStatusChanged(String provider, int status, Bundle extras)
// called when the location provider status changes. Possible status: OUT_OF_SERVICE, TEMPORARILY_UNAVAILABLE or AVAILABLE.
public void onProviderEnabled(String provider)
// called when the location provider is enabled by the user
public void onProviderDisabled(String provider)
// called when the location provider is disabled by the user. If it is already disabled, it's called immediately after requestLocationUpdates
public void onLocationChanged(Location location)
double latitute = location.getLatitude();
double longitude = location.getLongitude();
// do whatever you want with the coordinates
);
【问题讨论】:
【参考方案1】:这会将 lat & lng 转换为字符串地址,我已将其设置在您的示例的文本字段中。这是通过使用反向地理编码的概念来完成的,android 中有一个名为Geocoder
的类。
// Write the location name.
//
try
Geocoder geo = new Geocoder(this.getApplicationContext(), Locale.getDefault());
List<Address> addresses = geo.getFromLocation(latitude, longitude, 1);
if (addresses.isEmpty())
yourtextboxname.setText("Waiting for Location");
else
yourtextboxname.setText(addresses.get(0).getFeatureName() + ", " + addresses.get(0).getLocality() +", " + addresses.get(0).getAdminArea() + ", " + addresses.get(0).getCountryName());
【讨论】:
【参考方案2】:这是获取当前位置并在 Google 地图上绘制的代码
public class Showmap extends MapActivity
private MapView mapView;
private MapController mapController;
private LocationManager locationManager;
private LocationListener locationListener;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.showmap);
LocationManager locationManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
locationListener = new GPSLocationListener();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, locationListener);
mapView = (MapView) findViewById(R.id.mapView);
// enable Street view by default
mapView.setStreetView(true);
// enable to show Satellite view
// mapView.setSatellite(true);
// enable to show Traffic on map
// mapView.setTraffic(true);
mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
mapController.setZoom(16);
protected boolean isRouteDisplayed()
return false;
private class GPSLocationListener implements LocationListener
@Override
public void onLocationChanged(Location location)
if (location != null)
GeoPoint point = new GeoPoint(
(int) (location.getLatitude() * 1E6),
(int) (location.getLongitude() * 1E6));
mapController.animateTo(point);
mapController.setZoom(16);
// add marker
MapOverlay mapOverlay = new MapOverlay();
mapOverlay.setPointToDraw(point);
List<Overlay> listOfOverlays = mapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(mapOverlay);
String address = ConvertPointToLocation(point);
Toast.makeText(getBaseContext(), address, Toast.LENGTH_SHORT)
.show();
mapView.invalidate();
public String ConvertPointToLocation(GeoPoint point)
String address = "";
Geocoder geoCoder = new Geocoder(getBaseContext(),
Locale.getDefault());
try
List<Address> addresses = geoCoder.getFromLocation(
point.getLatitudeE6() / 1E6,
point.getLongitudeE6() / 1E6, 1);
if (addresses.size() > 0)
for (int index = 0; index < addresses.get(0)
.getMaxAddressLineIndex(); index++)
address += addresses.get(0).getAddressLine(index) + " ";
Log.i(address, address);
catch (IOException e)
e.printStackTrace();
return address;
@Override
public void onProviderDisabled(String provider)
@Override
public void onProviderEnabled(String provider)
@Override
public void onStatusChanged(String provider,int status,Bundle extras)
class MapOverlay extends Overlay
private GeoPoint pointToDraw;
public void setPointToDraw(GeoPoint point)
pointToDraw = point;
public GeoPoint getPointToDraw()
return pointToDraw;
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
long when)
super.draw(canvas, mapView, shadow);
// convert point to pixels
Point screenPts = new Point();
mapView.getProjection().toPixels(pointToDraw, screenPts);
// add marker
Bitmap bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.marker);
// 24 is the height of image
canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 24, null);
return true;
【讨论】:
【参考方案3】:使用反向地理编码,输入经纬度并获取地址。
Geocoder geocoder = new Geocoder(this, Locale.ENGLISH);
try
List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1);
if(addresses != null)
Address returnedAddress = addresses.get(0);
StringBuilder strReturnedAddress = new StringBuilder("Address:\n");
for(int i=0; i<returnedAddress.getMaxAddressLineIndex(); i++)
strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n");
myAddress.setText(strReturnedAddress.toString());
else
myAddress.setText("No Address returned!");
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
myAddress.setText("Canont get Address!");
【讨论】:
【参考方案4】:您要查找的短语是“反向地理编码”。 *** 上的Another question 讨论了相同的主题-您可以使用该人选择的答案:)
【讨论】:
嗨,Alexander 感谢您的回复,当我使用它时,我得到了类似 02-14 07:49:58.887: W/System.err(467): java.io.IOException: Service not Available 你添加权限和access_fine_location权限了吗?【参考方案5】:这仅用于提示添加您的代码!
public void onLocationChanged(Location location)
// TODO Auto-generated method stub
if (location != null)
System.out.println("in onlocationchanged");
String locationString=location.convert(location.getLatitude(),1);
Toast.makeText(this,"locationString=="+locationString, Toast.LENGTH_LONG).show();
double lat = location.getLatitude();
double lng = location.getLongitude();
String currentLocation = "The location is changed to Lat: " + lat + " Lng: " + lng;
Toast.makeText(this,currentLocation, Toast.LENGTH_LONG).show();
使用这两种方法
public double getLattitude()
return lattitude;
public double getLongitude()
return longitude;
【讨论】:
【参考方案6】:public class MainActivity extends AppCompatActivity
double latitude, longitude;
private TextView tvLocation;
private Button btnGetLocation;
private FusedLocationProviderClient locationProviderClient;
private Geocoder geocoder;
private List<Address> addresses;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestPermission();
locationProviderClient = LocationServices.getFusedLocationProviderClient(this);
tvLocation = findViewById(R.id.tv_location);
geocoder = new Geocoder(MainActivity.this, Locale.getDefault());
btnGetLocation = findViewById(R.id.btn_location);
btnGetLocation.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
if (ActivityCompat.checkSelfPermission(MainActivity.this, ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
return;
locationProviderClient.getLastLocation().addOnSuccessListener(MainActivity.this, new OnSuccessListener<Location>()
@Override
public void onSuccess(Location location)
if (location != null)
tvLocation.setText(location.toString());
latitude = location.getLatitude();
longitude = location.getLongitude();
try
addresses = geocoder.getFromLocation(latitude, longitude, 1);
String addressLine1 = addresses.get(0).getAddressLine(0);
Log.e("line1", addressLine1);
String city = addresses.get(0).getLocality();
Log.e("city", city);
String state = addresses.get(0).getAdminArea();
Log.e("state", state);
String pinCode = addresses.get(0).getPostalCode();
Log.e("pinCode", pinCode);
String fullAddress = addressLine1 + ", " + city + ", " + state + ", " + pinCode;
tvLocation.setText(fullAddress);
catch (IOException e)
e.printStackTrace();
Log.e("MainActivity", e.getMessage());
);
);
private void requestPermission()
ActivityCompat.requestPermissions(this, new String[]ACCESS_FINE_LOCATION, 1);
【讨论】:
有什么解释吗?您的答案与之前发布的答案有何不同? 使用的 FusedLocationProviderClient Api【参考方案7】:这是我获取当前国家/地区名称的代码。
private String getCountry()
String country_name = null;
LocationManager lm = (LocationManager)getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
Geocoder geocoder = new Geocoder(getApplicationContext());
for(String provider: lm.getAllProviders())
@SuppressWarnings("ResourceType") Location location = lm.getLastKnownLocation(provider);
if(location!=null)
try
List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
if(addresses != null && addresses.size() > 0)
country_name =addresses.get(0).getCountryName();
return country_name;
catch (IOException e)
e.printStackTrace();
Toast.makeText(getApplicationContext(), country_name, Toast.LENGTH_LONG).show();
return null;
但不要忘记在清单文件中添加此权限。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
【讨论】:
以上是关于android获取当前位置名称的主要内容,如果未能解决你的问题,请参考以下文章