最近在做定位相關的東西,把知識整理一下並分享出來。
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永遠是你的首選
完結!