我正在使用Android Geocoding通过Address.getLocality()方法获取当前城市。它运行良好,直到最近它似乎经常为本地返回null。这是一个例子:
try {
Geocoder c = new Geocoder(this, Locale.getDefault());
double lat = 51.481;
double lon = 0.0;
List<Address> l = c.getFromLocation(lat, lon, 5);
for (Address a: l) {
Log.i("GeocoderTest", "Locality " + a.getLocality() + " (" + a + ")");
}
} catch (IOException e) {
Log.e("GeocoderTest", "", e);
}
现在,它会为第一个返回的地址记录以下消息:
Locality null(地址[addressLines = [0:“14-18 Park Vista”,1:“London 伦敦格林威治自治市镇 SE10" ,2: “UK”] =功能,管理员= NULL,子管理= NULL,局部性= NULL,通途=公园 Vista中,POSTALCODE = NULL,COUNTRYCODE = GB,国家名称=美国 英国,hasLatitude =真,纬度= 51.4819069,hasLongitude =真,经度= -6.327E-4,电话= NULL,URL =无效,额外=空])
某些地区确实会返回该地区的城市,而旁边的地点却没有。
所以之前它确实工作得很好,实际上我以前没有看到过null的局部性。所以我想Google的地理编码服务肯定会发生一些变化。知道发生了什么,这种情况是永久性的吗?如果是,那么从一个地方确定城市的最佳方式是什么?
答案 0 :(得分:8)
我注意到,通常getLocality()为Geocoder返回的列表中的第一个地址返回null。 另一方面,正确的城市名称保留在下一个地址的位置 所以我使用这种解决方法,它适用于大城市:
private String getCityNameByCoordinates(double lat, double lon) throws IOException {
List<Address> addresses = mGeocoder.getFromLocation(lat, lon, 10);
if (addresses != null && addresses.size() > 0) {
for (Address adr : addresses) {
if (adr.getLocality() != null && adr.getLocality().length() > 0) {
return adr.getLocality();
}
}
}
return null;
}
答案 1 :(得分:6)
现在我住在加拿大,安大略省,汉密尔顿(汉密尔顿是我的城市,安大略省是省)
我注意到getLocality()
返回null,getAdminArea()
返回Ontario,getSubLocality()
返回Hamilton。 CH
答案 2 :(得分:1)
在 Kotlin 中我做了类似的事情,给定地址 a
var place = a.locality
if (place == null) place = a.subLocality
if (place == null) place = a.subAdminArea
if (place == null) place = a.adminArea
它甚至适用于偏远的地方
答案 3 :(得分:0)
使用// C++/CLI
IntPtr MyHost::WndProc (IntPtr hWndPtr, int uMsg, IntPtr wParamPtr, IntPtr lParamPtr, bool % handled)
{
auto hWnd = (HWND) hWndPtr.ToPointer ();
auto wParam = (WPARAM) wParamPtr.ToPointer ();
auto lParam = (LPARAM) lParamPtr.ToPointer ();
switch (uMsg)
{
case WM_LBUTTONDOWN: // This doesn't get called.
break;
...
default:
handled = false;
return IntPtr (DefWindowProc (hWnd, uMsg, wParam, lParam));
}
...
handled = true;
return IntPtr (0);
}
对我来说很好。