最近在做定位相關的東西,把知識整理一下並分享出來。
1.定位有三種,網路,基站,GPS
2.不管哪種定位核心是要取得經緯度,你知道了經緯度要換算成具體地理位置的方法是有很多種的
以下分別講述三種的實現:
◆GPS
比較簡單
public String mac; TextView msg; LocationManager locationManager; LocationListener locationListener; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); msg = (TextView) findViewById(R.id.text); locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); // 定義對位置變化的監聽函數 locationListener = new LocationListener() { public void onLocationChanged(Location location) { msg.setText("onLocationChanged" + location.getLatitude() + ",," + location.getLongitude()); Log.e("onLocationChanged", location.getLatitude() + ",," + location.getLongitude()); } public void onStatusChanged(String provider, int status, Bundle extras) { } public void onProviderEnabled(String provider) { } public void onProviderDisabled(String provider) { } }; locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); }
關於GPS需要注意的地方就是首先你手機定位設定那裡要開啟GPS,還有manifest.xml中相關的許可權要寫進去(一搜一大把,不贅述),最後記得在戶外測試,室內是測試不到GPS的。
◆基站
這一塊你要自己實現也是可以的,不過複雜程度遠比你想的要多一些。要擷取基站資訊可以使用Android內建的API,這很簡單如以下代碼
private void getCellInfo() throws Exception { /** 調用API擷取基站資訊 */ TelephonyManager mTelNet = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); GsmCellLocation location = (GsmCellLocation) mTelNet.getCellLocation(); if (location == null) throw new Exception("擷取基站資訊失敗"); String operator = mTelNet.getNetworkOperator(); Log.e("基站資訊", operator); String mcc = operator.substring(0, 3); String mnc = operator.substring(3,5); int cid = location.getCid(); int lac = location.getLac(); Log.e("具體基站資訊", "mcc=" + mcc + ",mnc=" + mnc + ",lac=" + lac + ",cid=" + cid); }
但是你要吧基站資訊轉為經緯度就比較麻煩了,這裡當然最權威的是google了,網路上也找過一些其他的免費網站,很顯然不靠譜,我相信你搜出過這樣的API介面http://www.google.com/loc/json,我很負責任的告訴你,這個介面用不了,現在停用了,如果你研究了半天,一直在想post過去的資料為什麼不行,然後發現原來是這個API停用了,那我覺得你現在看到我這篇文章是幸福的,所以還是用google把,下面進入此網站https://developers.google.com/maps/documentation/business/geolocation/這裡面就有我們需要的資訊,我找了很久,google maps各種相關的API都找過了,這裡有我們需要的通過基站資訊得到經緯度的API,不過它是基於商業的,測試每天100次上限,發布後應該要用收費的,具體費用沒查了。不要覺得這個很容易,我相信你花了半天在測試的時候會發現更多衍生出來的問題。而且需要有英語閱讀能力,對於大部分人來說門檻過高了,建議略過。因為基站實際情況下並不太好用,比如手機沒SIM卡和平板的情況下,是用不了基站的。
◆網路
最建議大家使用的還是網路定位,因為網路實在太普遍的,行動裝置現在基本都能上網,當然我這說的是wifi情況下的。3G的沒條件測試過,這裡請不要使用android內建的API,如
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
因為國內大部分手機被閹割過了,你運氣好的話,也許能擷取到資料,如果運氣不好,搞了半天你發現是手機系統被閹割後的問題,我想你可能會抓狂的。所以網路定位我們不能依賴Android API了。這裡就推薦一下百度定位把,我測試了下,速度蠻好,也還准。地址如下http://developer.baidu.com/map/sdk-android.htm。然後
看一下裡面的simple中的MyLocation類,簡單明了,快速解決問題。不過國外沒測試過,不知道百度能不能用在國外了。當然google maps中android版SDK應該也有相應的功能,不過有點繁瑣了,比如你只定位國內的話,相信百度可以了,如果是國際上,那google永遠是你的首選
完結!