Location服務之Geocoder

發表於2015-04-11

提到Android基於位置的服務,就不得不提android.location包,location包提供了很便捷的API來實現基於位置的服務。主要包括Geocoder和LocationManager。今天就先來介紹一下Geocoder。

Geocoder可以在街道地址和經緯度地圖座標之間進行轉換。它提供了對兩種地理編碼功能的訪問:

Forward Geocoding(前向地理編碼):查詢某個地址的經緯度

Reverse Geocoding(反向地理編碼):查詢一個給定的經緯度所對應的街道地址。

分別對應以下方法:

我們新建一個location的專案。因為示例要使用到地圖服務,所以建立時Build Target要選擇Google APIs這一項。

然後修改/res/layout/main.xml,程式碼如下:

然後我們來看一下MainActivity.java檔案,程式碼如下:

最後需要在AndroidManifest.xml中的application標籤之間加入google map library:

然後就是一些位置服務所需的許可權:

有一點需要跟朋友們提一下,Geocoder查詢是同步地進行的,因此,它們將會阻塞呼叫它們的執行緒。對於低速的資料連線來說,這可能會導致出現ANR(Application Not Respond)的問題。在大部分情況下,更好的做法是把這些查詢移動到服務或者後臺執行緒中,前面幾篇文章中也涉及到了一些非同步任務的相關知識,不熟悉的朋友們可以參看以下HandlerAsyncTask的使用。為了清晰和簡潔起見,上面程式碼中的查詢操作直接放在了UI執行緒中,應用時最好不要這樣寫。

做完上面的操作,基本上就算是完成了該示例。不過如果使用模擬器時用的是Google API v8時會出現一個異常,將無法完成查詢功能:

這是什麼原因呢?在網上搜尋了一通,發現討論區,真的很給力:http://code.google.com/p/android/issues/detail?id=8816

看看個別的評論:

看來真機和v7都沒問題,v8會出問題。

也有高人給出解決方案,另闢蹊徑,使用訪問url的方式,獲取json資料,然後解析獲取經度和緯度,最後再組裝成一個GeoPoint物件即可。我們新建一個LocationUtil.java檔案,程式碼如下:

然後對MainActivity.java關鍵地方進行改寫:

大功告成,當我們搜尋後把結果中的第一個顯示到地圖中,然後點選圖示時,彈出提示。我們來看一下效果:

以上是關於android.location包基於位置服務中Geocoder的基本介紹,更多的內容會在以後找機會和大家再分享。

相關文章