一、LocationManager獲取經緯度及定位過程。
如何利用LocationManager獲取經緯度,並利用Geocoder將經緯度轉換爲城市街道等信息。
LocationManager
LocationManager定位管理者實例通過getSystemService()方法獲得。
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
得到LocationManager實例後,再結合LocationProvider就可以得到經緯度了,LocationProvider分爲兩種。
LocationProvider gpsProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER);//通過GPS定位,較精確,也比較耗電
LocationProvider netProvider = locationManager.getProvider(LocationManager.NET_PROVIDER);通過網絡定位,對定位精確度不高或省點情況可考慮使用
進行定位前,需要對兩種LocationProvider是否存在進行判斷if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) != null || locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) != null) {
- /*
- * 進行定位
- * provider:用於定位的locationProvider字符串:LocationManager.NETWORK_PROVIDER/LocationManager.GPS_PROVIDER
- * minTime:時間更新間隔,單位:ms
- * minDistance:位置刷新距離,單位:m
- * listener:用於定位更新的監聽者locationListener
- */
- locationManager.requestLocationUpdates(provider, minTime, minDistance, listener);
- } else {
- //無法定位:1、提示用戶打開定位服務;2、跳轉到設置界面
- Toast.makeText(this, "無法定位,請打開定位服務", Toast.LENGTH_SHORT).show();
- Intent i = new Intent();
- i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
- startActivity(i);
- }
}
當LocationProvider不爲空時,進行定位,爲Null時,提示用戶打開定位服務,在代碼中進行跳轉,供用戶勾選。
LocationListener
在定位時需要實現一個LocationListener位置監聽接口,主要重寫onLocationChanged()方法。
//位置改變回調方法
//@params location 當前的位置
public void onLocationChanged(Location location){
//得到緯度
double latitude = location.getLatitude();
//得到徑度
double longitude = location.getLongitude();
}
其他需要重寫的方法有:
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onProviderEnabled(String provider) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onProviderDisabled(String provider) {
- // TODO Auto-generated method stub
- }
GerCoder經緯度解碼者可用於將經緯度轉爲詳細位置信息:國家,城市,街道名稱等
- Geocoder gc = new Geocoder(this, Locale.getDefault());
- List<Address> locationList = null;
- try {
- locationList = gc.getFromLocation(latitude, longitude, 1);
- } catch (IOException e) {
- e.printStackTrace();
- }
- Address address = locationList.get(0);//得到Address實例
- //Log.i(TAG, "address =" + address);
- String countryName = address.getCountryName();//得到國家名稱,比如:中國
- Log.i(TAG, "countryName = " + countryName);
- String locality = address.getLocality();//得到城市名稱,比如:北京市
- Log.i(TAG, "locality = " + locality);
- for (int i = 0; address.getAddressLine(i) != null; i++) {
- String addressLine = address.getAddressLine(i);//得到周邊信息,包括街道等,i=0,得到街道名稱
- Log.i(TAG, "addressLine = " + addressLine);
- }
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
- <uses-permission android:name="android.permission.INTERNET" />