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构造函数的参数不正确。 您正在传递一个期望Context
的Locale
。
有两个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查找位置的示例应用程序。 随意在这里查看
用这个
Geocoder geocoder = new Geocoder(this, Locale.getDefault()); List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);