Android:反向地理编码 – getFromLocation

我正在尝试获取基于long / lat的地址。 看起来像这样的东西应该工作?

Geocoder myLocation = Geocoder(Locale.getDefault()); List myList = myLocation.getFromLocation(latPoint,lngPoint,1); 

问题是,我不断得到:typessavemaplocation未定义方法Geocoder(Locale)

任何援助将是有益的。 谢谢。


谢谢,我尝试了上下文,第一个语言环境,并失败了,正在看一些其他的构造函数(我曾经看过一个刚刚提到的语言环境)。 而不pipe,

它没有工作,因为我仍然得到:方法Geocoder(上下文,区域设置)未定义的typessavemaplocation

我有:导入android.location.Geocoder;

下面的代码片段正在为我做(lat和lng是在这个位上面声明的双打):

 Geocoder geocoder = new Geocoder(this, Locale.getDefault()); List<Address> addresses = geocoder.getFromLocation(lat, lng, 1); 

这是一个完整的示例代码,使用线程和处理程序来获取Geocoder的答案,而不会阻塞用户界面。

Geocoder调用过程,可以位于Helper类中

 public static void getAddressFromLocation( final Location location, final Context context, final Handler handler) { Thread thread = new Thread() { @Override public void run() { Geocoder geocoder = new Geocoder(context, Locale.getDefault()); String result = null; try { List<Address> list = geocoder.getFromLocation( location.getLatitude(), location.getLongitude(), 1); if (list != null && list.size() > 0) { Address address = list.get(0); // sending back first address line and locality result = address.getAddressLine(0) + ", " + address.getLocality(); } } catch (IOException e) { Log.e(TAG, "Impossible to connect to Geocoder", e); } finally { Message msg = Message.obtain(); msg.setTarget(handler); if (result != null) { msg.what = 1; Bundle bundle = new Bundle(); bundle.putString("address", result); msg.setData(bundle); } else msg.what = 0; msg.sendToTarget(); } } }; thread.start(); } 

以下是您的UI活动中对此Geocoder过程的调用:

 getAddressFromLocation(mLastKownLocation, this, new GeocoderHandler()); 

处理程序在您的用户界面中显示结果:

 private class GeocoderHandler extends Handler { @Override public void handleMessage(Message message) { String result; switch (message.what) { case 1: Bundle bundle = message.getData(); result = bundle.getString("address"); break; default: result = null; } // replace by what you need to do myLabel.setText(result); } } 

不要忘记把你的Manifest.xml的以下权限

 <uses-permission android:name="android.permission.INTERNET" /> 

看起来这里有两件事情发生。

1)在调用构造函数之前,您已经错过了new关键字。

2)您传递给Geocoder构造函数的参数不正确。 您正在传递一个期望ContextLocale

有两个Geocoder构造函数,都需要一个Context ,还有一个地方:

 Geocoder(Context context, Locale locale) Geocoder(Context context) 

修改你的代码传入一个有效的上下文,并包括new ,你应该很好去。

 Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); List<Address> myList = myLocation.getFromLocation(latPoint, lngPoint, 1); 

注意

如果你仍然有问题,这可能是一个许可问题。 地理编码隐含地使用互联网来执行查找,因此您的应用程序将需要清单中的INTERNET使用权限标签。

manifest节点内添加以下uses-permission节点。

 <uses-permission android:name="android.permission.INTERNET" /> 

原因是不存在的后端服务:

Geocoder类需要一个不包含在核心android框架中的后端服务。 如果平台中没有后端服务,Geocoder查询方法将返回一个空列表。

首先使用Location和LocationManager类获取纬度和经度。 现在尝试下面的代码获取城市,地址信息

 double latitude = location.getLatitude(); double longitude = location.getLongitude(); Geocoder gc = new Geocoder(this, Locale.getDefault()); try { List<Address> addresses = gc.getFromLocation(lat, lng, 1); StringBuilder sb = new StringBuilder(); if (addresses.size() > 0) { Address address = addresses.get(0); for (int i = 0; i < address.getMaxAddressLineIndex(); i++) sb.append(address.getAddressLine(i)).append("\n"); sb.append(address.getLocality()).append("\n"); sb.append(address.getPostalCode()).append("\n"); sb.append(address.getCountryName()); } 

市信息现在在sb。 现在将sb转换为String(使用sb.toString())。

那么,我仍然难倒。 所以这里是更多的代码。

在我离开我的地图之前,我调用了SaveLocation(myMapView,myMapController); 这就是最终调用我的地理编码信息。

但由于getFromLocation可以抛出一个IOException ,我不得不做以下调用SaveLocation

 try { SaveLocation(myMapView,myMapController); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

然后我必须改变SaveLocation通过说它抛出IOExceptions:

  public void SaveLocation(MapView mv, MapController mc) throws IOException{ //I do this : Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); List myList = myLocation.getFromLocation(latPoint, lngPoint, 1); //... } 

每次都会崩溃。

我听说Geocoder是在越野车方面。 我最近汇集了一个使用Google的http地理编码服务从lat / long查找位置的示例应用程序。 随意在这里查看

http://www.smnirven.com/?p=39

用这个

 Geocoder geocoder = new Geocoder(this, Locale.getDefault()); List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);