通過Android手機上的定位信息來源可分為三種,GPS,Cell-ID,和Wifi. 后兩種因為都按來自於網絡,所以在Android SDK中統一為基於網絡的定位。目前三種定位方式都不夠完善,各有優缺點。
基於GPS信號的定位在三者中精度較高,但是缺點是當前民用的GPS信號在建築物內的信號比較差,而且GPS模塊啟動的時間也比較慢,它的工作原理其實是搜索附近的4顆衛星,根據當前位置到這四顆衛星的距離來定位,GPS模塊找到四顆衛星(也稱之為GPS的啟動過程)根據信號強度和地域的不同有可能需要幾分鍾的時間;基於基站和Wifi的定位在Android API中被統一稱為網絡定位,開發者無法將兩者區分開來,他們的特點是速度快,但是精度不如GPS高。我們也常常聽說到AGPS定位算法,是結合了兩種算法的優點,首先根據網絡的快速定位來獲得一個大致位置,然后根據這個位置去幫助GPS模塊快速地搜索到附近的衛星。這是目前通過的效果較好的手機定位方式。下面僅僅介紹如何進行基本的GPS定位和網絡定位。
在開始定位之前首先要獲得LocationManager,然后根據可以根據一定的規則去選擇一個定位方法,代碼如下,
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
選擇定位算法的規則:
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE); //設置為最大精度
criteria.setAltitudeRequired(false); //不要求海拔信息criteria.setCostAllowed(true); //是否允許付費
criteria.setPowerRequirement(Criteria.POWER_LOW); //對電量的要求
criteria.setBearingRequired(false); //不要求Bearing信息
關於Bearing的解釋,請查看Bearing釋疑
//根據上述法則選擇一個定位方法
bestProvider = locationManager.getBestProvider(criteria, false);
//通常我們為了提高用戶體驗,我們先把上次定位的結果緩存下來,
//在啟動先打開上次定位結果,稱為last known location
Location location = locationManager.getLastKnownLocation(bestProvider);
//接下來我們在Activity的顯示界面的函數OnResume中啟動定位的位置更新
locationManager.requestLocationUpdates(bestProvider, 2000, 1, this);
//並且在OnPause函數中關閉
locationManager.removeUpdates(this);
// 讓當前Activity實現LocationListener端口,在onLocationChanged函數獲得定位信息
public void onLocationChanged(Location location) {
Log.d(TAG, "Latitude :" + location.getLatitude());
Log.d(TAG, "Longitude :" + location.getLongitude());
}
//最近記得在AndroidMenifest.xml文件中賦於定位的權限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />