从上次说记录Android学习之路,到这一篇,半个月了。很惭愧。。。进度比较慢。今天终于吧百度定位给弄好了,花了2天时间。来总结一下。
4.0需要密钥,我用的是3.3版本的。SDK和例子的下载地址:http://developer.baidu.com/map/geosdk-android-download.htm
例子本身写的调理很清晰,我第一次把例子拷出来,用真机与模拟器测试老是显示4.9E。。这个坐标。原因是导入文件不全面,导入文件的步骤:
1.将liblocSDK3.so文件拷贝到libs/armeabi目录下。
2.将locSDK3.3.jar文件拷贝到工程的libs目录下,
3.并在工程属性->Java Build Path->Libraries中选择“Add JARs”,选定locSDK3.3.jar,确定后返回。
例子中的两个类,一个是Location,一个是主线程。
=======================================================================================================================================================
Location主要就是实现了BDLocationListener和BDNotifyListener这两个类。
英文好的童鞋就能看出来BDLocationListener注册位置监听,翻译过来。这个类的里面有两个抽象方法,
-
BDNotifyListener类,我的理解是定时的获取用户所在的位置,如果发生改变就通知主线程。不知道我的理解对不对,不对还请大神纠正。(这个方法在我的项目中也没应用)======================================================================================================================================================主线程
创建LocationClient对象。
下面说一下定位走的步骤:
对象.start();这个方法一定是第一步,如果对象没有start,就没有办法请求定位。
第二步是,设置对象的相关参数(设置定位参数包括:定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等。看个人需要设定几个)
-
LocationClientOption option
=
new LocationClientOption
(
)
;
-
option.
setOpenGps
(
true
)
;
-
option.
setAddrType
(
"all"
)
;
//返回的定位结果包含地址信息
-
option.
setCoorType
(
"bd09ll"
)
;
//返回的定位结果是百度经纬度,默认值gcj02
-
option.
setScanSpan
(
5000
)
;
//设置发起定位请求的间隔时间为5000ms
-
option.
disableCache
(
true
)
;
//禁止启用缓存定位
-
option.
setPoiNumber
(
5
)
;
//最多返回POI个数
-
option.
setPoiDistance
(
1000
)
;
//poi查询距离
-
option.
setPoiExtraInfo
(
true
)
;
//是否需要POI的电话和地址等详细信息
-
mLocClient.
setLocOption
(option
)
;
第三个步是
对象.requestLocation()请求定位。
第四步对象.stop();记得关闭哦。
四个步骤,看明白了,代码是不是也很好理解了。下面写一下我的Demo。我是只要用户所在的城市这个参数。
public class MainActivity extends Activity {
private TextView textView;
private LocationClient mLocationClient = null;
private BDLocationListener myListener = new MyLocationListenner();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.textView1);
mLocationClient = new LocationClient(getApplication());//创建LocationClient对象
mLocationClient.registerLocationListener(myListener);//注册监听
mLocationClient.start();//start方法
setLocationOption();//设置参数
}
public class MyLocationListenner implements BDLocationListener {//监听器
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null) {
return;
} else {
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation) {
sb.append("\nspeed : ");
sb.append(location.getSpeed());
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
sb.append("\naddr : ");
sb.append(location.getAddrStr());
sb.append("\ndizhi:");
sb.append(location.getCity());
sb.append(location.getCityCode());
}
sb.append("\nsdk version : ");
sb.append(mLocationClient.getVersion());
sb.append("\nisCellChangeFlag : ");
sb.append(location.isCellChangeFlag());
textView.setText(sb.toString());
System.out.println(sb.toString());
mLocationClient.stop();//stop方法
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
public void setLocationOption() {//设置参数方法
LocationClientOption option = new LocationClientOption();
if (isGpsEnable()) {//如果是GPS
option.setPriority(LocationClientOption.GpsFirst);
} else if (isNetworkConnected()) {//如果是网络
option.setAddrType("all");// 返回的定位结果包含地址信息
option.setPriority(LocationClientOption.NetWorkFirst);
} else {
option = null;
}
option.setPoiNumber(3);
option.disableCache(true);
mLocationClient.setLocOption(option);
}
/** GPS是否打开 */
private boolean isGpsEnable() {
LocationManager locationManager = ((LocationManager) this.getSystemService(Context.LOCATION_SERVICE));
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
/** 网络是否连接 */
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo network = cm.getActiveNetworkInfo();
if (network != null) {
return network.isAvailable();
}
return false;
}
}
下面是模拟器与后台的信息输出。