获取android应用的当前位置地址
Posted
技术标签:
【中文标题】获取android应用的当前位置地址【英文标题】:Get current location address for android app 【发布时间】:2011-06-29 01:37:21 【问题描述】:我不需要显示地图。但是,我需要使用 gps/3g 网络来定位我当前的位置 ADDRESS(不是 long 和 lat),然后将其添加到自动短信响应中,以通知某人我目前无法回复,并包括字符串地址我现在的位置。 我有短信工作,只需要找出一种访问gps和提取地址的方法。我已经看到了 lat/long 的示例代码。也许我需要将 lat/long 转换为 google maps API 中的地址?我不确定如何去做。 欢迎任何建议/代码 sn-ps/类似教程! 谢谢。 :)
【问题讨论】:
【参考方案1】:有两个步骤:
使用 GPS、网络、最后已知位置等获取当前位置 - 纬度和经度。android location documentation 包含示例代码。
使用 Android Geocoder class 请求查找以将纬度/经度转换为地址(您可以从中轻松提取城市、国家、街道等)。具体来说,需要使用getFromLocation()方法
注意:
getFromLocation() 方法返回一组匹配项。在某些情况下,您可以向用户展示一组(例如 5 个)并让他们选择最好的一组,或者您可以只使用第一个,假设它是最好的。 请记住,这两个调用都需要时间。 GPS/网络可能需要一段时间才能提供位置。同样,对 getFromLocation() 的调用可能需要一些时间,因为它会通过网络到达 Google Maps API。因此,您必须为各种场景使用广泛的错误处理,并将这两个调用移到单独的线程上,这样您就不会锁定应用用户界面(查看 AsyncTask) Geocoder 类后端仅存在于 Google 批准的设备上。因此,在任何没有 GMail/Market/Maps 的设备上,查找基本上都会失败。【讨论】:
谢谢。 :) 你知道任何可以使它更容易的教程吗?我觉得有点难以理解。 :-\ 不幸的是,它相当复杂。我建议你首先编写代码来获取位置,然后进行地理编码,然后如果你想要更好的性能,然后开始使用 asynctask。上面链接中的代码是最好的起点,因为它完全解释了所有内容。这只是花时间阅读、编码、重新阅读、调试,直到你理解它的问题。 Ollie,现在可以计算经纬度了。接下来将尝试将其转换为实际地址。再次感谢。 :) 奥利,终于有这个工作了。但正如你提到的,存在性能问题。随着活动与 GPS 和互联网一起运行,应用程序的 GUI 变得迟钝。在单独的线程中处理反向地理编码以防止锁定有多困难? 阅读 AsyncTask,它会变得非常简单。最简单的方法是在您的活动中创建一个内部类(子类 AsyncTask)并将您的代码移动到那里。 doInBackground() 是您放置名称查找调用的位置,onPostExecute() 是您更新 UI 的位置。 developer.android.com/reference/android/os/AsyncTask.html【参考方案2】:答案在这里:http://developer.android.com/reference/android/location/Geocoder.html
您需要创建 Geocoder 对象并调用getFromLocation(double latitude, double longitude, int maxResults)
Geocoder gCoder = new Geocoder(myContext);
ArrayList<Address> addresses = gCoder.getFromLocation(123456789, 123456789, 1);
if (addresses != null && addresses.size() > 0)
Toast.makeText(myContext, "country: " + addresses.get(0).getCountryName(), Toast.LENGTH_LONG).show();
【讨论】:
谢谢,觉得这有点令人困惑,但会好好读一读,看看我是否有任何收获:) 真的在为此苦苦挣扎。我可以得到纬度和经度并将其打印到屏幕上。我想打印地址。谁能告诉我如何创建地理编码器对象以及如何实现 getFromLocation 方法?阅读提供的链接,但完全丢失了 atm。 谢谢沃伦。真的很感谢你的帮助。 :) 我不确定“myContext”应该在哪里。 “长度无法解析或不是字段”也是一个错误。我的 lat 和 long 已添加到名为 my coords 的字符串中,该字符串是使用 get 方法从另一个类中检索的。这使情况更加复杂。 如果你在一个activity中使用this,你可以使用“this”作为context,因为activity继承自context。否则尝试在某处找到相应的上下文。长度是错误的,仅受纯数组支持。应该是size()
。【参考方案3】:
如您所知,您可以使用 google GeoCoder 获取位置地址
除了通过提供纬度和经度来获取位置地址之外,您还可以使用此 API。这比 google Geocoder 可靠且速度更快。这里我附上链接和小示例...
API 网址 -
https://maps.googleapis.com/maps/api/geocode/json?latlng=
您可以在网址的等号旁边连接纬度和经度值。
例子-
纬度 = 6.123456
lng = 79.123456
字符串网址 =
"https://maps.googleapis.com/maps/api/geocode/json?latlng=lat+","+lng";
这将返回一个不错的jsonObject,你可以玩它,试试这个。目前我使用这个API来提供我的定位服务,它比普通的谷歌更快geoCoder API。要捕获 json 响应,您可以使用 volley 或任何东西。快乐编码。
【讨论】:
以上是关于获取android应用的当前位置地址的主要内容,如果未能解决你的问题,请参考以下文章
Android - startActivityForResult 获取用户位置?
Android怎么实现点击按钮获取当前位置的信息,没有地图的情况下。