最近應爲工作需要,要做定位的功能
在定位的功能實現中首先我們需要獲取到系統的LocationManager,獲取方式爲
// 獲取系統定位管理
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager) getSystemService(context);
然後可以設置Criteria:
// 設置Criteria(服務商)的信息
Criteria criteria = new Criteria();
// 經度要求
// criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(false);
criteria.setPowerRequirement(Criteria.POWER_LOW);
// 取得最好效果的criteria
String provider = locationManager.getBestProvider(criteria, true);
這個時候就可以獲得相應的座標信息了:
// 獲得座標相應信息
Location location = locationManager.getLastKnownLocation(provider);
當然我們還可以設置監聽事件:
//設置監聽
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,500, 20,locationListener);
參考信息
由於人的位置是不斷變化,我要設置一個位置變化的範圍,包括同時滿足最小的時間間隔和最小的位移變化,如果兩個條件要同時滿足,將位置監聽器將被觸發。實際上該方法有多個參數格式,特別是requestLocationUpdates (long minTime, float minDistance, Criteria criteria,PendingIntent intent),當位置變化時可調用其他的Activity。 在本例中,我們制定用GPS,則在權限中必須要求精確定位許可。
mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000/*10秒,爲測試方便*/, 1000/*1公里*/, onLocationChange/*位置監聽器*/);
監聽事件:
// 提供定位信息發生改變時的回調。必須事先在定位管理器中註冊監聽器對象。
private LocationListener locationListener = new LocationListener() {
// Provider的轉態在可用、暫時不可用和無服務三個狀態直接切換時觸發此函數
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
// Provider啓用時觸發此函數,比如GPS被打開。
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
// Provider禁用時觸發此函數,比如GPS被關閉。
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
// 當座標改變時候觸發該函數,如果Provider傳相同的座標,它就不會觸發。
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if (location != null) {
// 爲繪製標誌的類設置座標
// myPosition.
// 取得經度和緯度
Double geoLat = location.getLatitude() * 1E6;
Double geoLng = location.getLongitude() * 1E6;
Log.i("latitudetag", Double.toString(geoLat));
Log.i("latitudetag", Double.toString(geoLng));
edittext.setText(Double.toString(geoLat) + "," + Double.toString(geoLng));
}
}
};
之前一直不知道餓了麼這種送餐平臺爲什麼定位需要開啓wifi現在也有些瞭解:
參考知乎上面的回答:
2.設備在開啓Wi-Fi的情況下,即可掃描並收集周圍的AP信號,無論是否加密,是否已連接,甚至信號強度不足以顯示在無線信號列表中,都可以獲取到AP廣播出來的MAC地址
3.設備將這些能夠標示AP的數據發送到位置服務器,服務器檢索出每一個AP的地理位置,並結合每個信號的強弱程度,計算出設備的地理位置並返回到用戶設備
其中步驟有:
2、只要能夠搜索到wifi信號,就能得知AP的MAC地址,並不需要連接到wifi。
3、每一個AP在地理座標上作爲一個錨點,並且用MAC地址來唯一標識它。
4、wifi定位是通過參照一個或多個AP的座標計算得出來的。
5、在服務器端維護了一個AP的座標數據庫。
6、AP的位置(座標)是通過參照連網的GPS設備得到,GPS設備定位成功後GPS應用自動將其周邊的AP信息反饋給服務器,自動維護AP座標數據庫。
7、通過wifi定位時,GPS應用通過周邊AP信號的MAC地址去查詢每個AP的座標,並根據信號的強度計算出所在的位置。