事實上LocationManager,Geocoder這些Android API給我們提供的這些類就能夠滿足了。
以下筆者就來講講怎樣利用LocationManager獲取經緯度,並利用Geocoder將經緯度轉換為城市街道等信息。
LocationManager
LocationManager定位管理者實例通過getSystemService()方式獲得
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 {
//無法定位: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位置監聽接口,主要是重寫onLocaiontChanged()方法
/**
* 位置改變回調方法
* @param location 當前的位置
* @return void
*/
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
}
Geocoder
Geocoder經緯度解碼者可用於將經緯度轉為具體位置信息:國家,城市,街道名稱等
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" />
修正:
文中的if (locationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null || locationManager.getProvider(LocationManager.GPS_PROVIDER) != null)
這個推斷請改為:
if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) || locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
轉載請注明原作者:xiong_it和原文鏈接:http://blog.csdn.net/xiong_it/article/details/46968477。謝謝!
