Android開發:LocationManager獲取經緯度及定位過程(附demo)

在Android開發其中。經常需要用到定位功能,尤爲是依賴於地理位置功能的應用。很是多人喜歡使用百度地圖,高德地圖提供的sdk。開放API,但是在只需要經緯度,或者城市,街道地址等信息。並不需要提供預覽地圖。地圖界面的應用中。這時,不需要使用百度地圖。高德地圖。這樣作只會添加apk的體積。怎麼辦呢?

事實上LocationManager,Geocoder這些Android API給咱們提供的這些類就可以知足了。java

如下筆者就來說講怎樣利用LocationManager獲取經緯度,並利用Geocoder將經緯度轉換爲城市街道等信息。android


LocationManager

LocationManager定位管理者實例經過getSystemService()方式得到git

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

獲得LocationManager實例後,再結合LocationProvider就可以獲得經緯度了,LocationProvider分爲兩種:

LocationProvider gpsProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER);//1.經過GPS定位,較精確。也比較耗電
LocationProvider netProvider = locationManager.getProvider(LocationManager.NETWORK_PROVIDER);//2.經過網絡定位。對定位精度度不高或省點狀況可考慮使用

進行定位前,需要對兩種LocationProvider是否存在進行推斷:

if (locationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null || locationManager.getProvider(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 {
        //沒法定位:一、提示用戶打開定位服務;二、跳轉到設置界面
	Toast.makeText(this, "沒法定位,請打開定位服務", Toast.LENGTH_SHORT).show();
	Intent i = new Intent();
	i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
	startActivity(i);
	}
當LocationProvider不爲空null時,進行定位,當它爲空時。提示用戶打開定位服務,在代碼中進行了跳轉。供用戶勾選。
定位設置頁面


LocationListener

在定位時。需要實現一個LocationListener位置監聽接口,主要是重寫onLocaiontChanged()方法網絡

/**
 * 位置改變回調方法
 * @param location 當前的位置
 * @return void
 */
public void onLocationChanged(Location location){
	//獲得緯度
	double latitude = location.getLatitude();
	//獲得經度
	double longitude = location.getLongitude();
} 

其它需要重寫的方法有:ide

@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
		
}


Geocoder

Geocoder經緯度解碼者可用於將經緯度轉爲具體位置信息:國家,城市,街道名稱等this

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);
}

 最後,別忘記加入權限:spa

    <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" />


修正:.net

文中的if (locationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null || locationManager.getProvider(LocationManager.GPS_PROVIDER) != null)code

這個推斷請改成:blog

if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) || locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))


demo下載地址:http://download.csdn.net/detail/xiong_it/8916215

轉載請註明原做者:xiong_it和原文連接:http://blog.csdn.net/xiong_it/article/details/46968477。謝謝!

相關文章
相關標籤/搜索