我正在编写自己的Android应用程序,我希望为用户提供从Google地图应用程序共享位置(地址/地理位置)的可能性。
我设法将我的应用注册为一个意图监听器并接收共享字符串。但是这个字符串只包含一个相当含糊的地址描述和一个缩短的谷歌链接,如下所示:
1029 E 29th St
https://goo.gl/maps/G9UbkTH3R9B2
当我按照该链接(在设备上或我的计算机上)时,将打开谷歌地图并显示正确的位置。所以这工作得很好。
我想要的是获取该位置的地址,最好是Address
个对象的形状。我无法找到任何api描述。 如何获取共享位置的地址?
答案 0 :(得分:0)
好吧,这有点像hacky,但它的目的(主要是)。
您可以在查询已解析的网址时找到地址的很大一部分。请尝试以下方法:
String url = ... // the URL from your shared string
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
int responseCode = conn.getResponseCode();
while (responseCode != HttpURLConnection.HTTP_OK &&
responseCode == HttpURLConnection.HTTP_MOVED_TEMP ||
responseCode == HttpURLConnection.HTTP_MOVED_PERM ||
responseCode == HttpURLConnection.HTTP_SEE_OTHER) {
url = conn.getHeaderField("Location");
if (url.contains("q=")) {
break;
}
conn = (HttpURLConnection) new URL(newUrl).openConnection();
responseCode = conn.getResponseCode();
}
url
现在包含查询。提取:
for (String t : queryUrl.substring(queryUrl.indexOf("?") + 1).split("&")) {
if (t.startsWith("q=")) {
url = URLDecoder.decode(t.substring(2));
}
}
现在,url
包含Google搜索查询中使用的已解码地址说明。您可以使用该String从address
类中获取Geocoder
对象(需要上下文):
Geocoder geocoder = new Geocoder(getContext(), Locale.getDefault());
List<Address> fromLocationName = geocoder.getFromLocationName(address, 1);
你有你的地址。 getFromLocationName()
方法调用中的第二个参数表示预期的最大结果数。如果要提示用户选择显式结果对象,请在此处使用更高的数字。
未解决的问题
现在到了它的缺点。有时,查询不是地址描述,而是一对坐标(纬度/经度)。在这种情况下,从地理编码器接收的地址对象不必返回与查询中给出的坐标相同的坐标。你决定如何解决这个问题。
在某些情况下,我发现没有查询网址。相反,网址中有cid
值。我还无法弄清楚该怎么做。不幸的是,Geocoder
也没有。但也许别人知道如何处理。