最近了解了下百度地图SDK,记录下。
百度给出了详细的开发者文档,可以参见http://developer.baidu.com/map/sdk-android.htm,其中百度地图SDK现在将定位单独弄出来个SDK,现在讲下我对定位SDK的一些封装。
关于定位SDK的使用,百度讲的很详细了,我就不再赘述。详细参见:http://developer.baidu.com/map/geosdk-android.htm
将我的封装应用情景大致说下:假定APP偶尔定位,在APP的不同Activity或者不同情境下有可能需要请求定位,在某种情况下某个Activity可以主动关闭定位。定位信息获取之后需要关闭定位,并且将定位信息传递给某个Activity或者某个请求者。对这些需求进行封装。
解决的办法如下:
自定义一个Application,在Application对定位进行封装。代码如下:
public class LocationApplication extends Application {
private LocationClient locationClient = null;
private LocationListenner myListener = new LocationListenner();
// 百度定位SDK可以返回三种坐标系,分别是bd09, bd09ll和gcj02,其中bd09ll能无偏差地显示在百度地图上。
// gcj02是测局制定的。
private static final String COOR_TYPE = "gcj02";
private static final String BAIDU_LOCAL_SDK_SERVICE_NAME = "com.baidu.location.service_v2.9";
// 定位sdk提供2种定位模式,定时定位和app主动请求定位。
// setScanSpan < 1000 则为 app主动请求定位;
// setScanSpan>=1000,则为定时定位模式(setScanSpan的值就是定时定位的时间间隔))
// 定时定位模式中,定位sdk会按照app设定的时间定位进行位置更新,定时回调定位结果。
// 此种定位模式适用于希望获得连续定位结果的情况。
// 对于单次定位类应用,或者偶尔需要一下位置信息的app,可采用app主动请求定位这种模式。
private static final int SCAN_SPAN_TIME = 500;
private static final String PRODUCT_NAME = "com.youku.paike";
private DataFeedbackListener dataFeedbackListener;
@Override
public void onCreate() {
locationClient = new LocationClient(this);
locationClient.registerLocationListener(myListener);
setLocationOption();
super.onCreate();
}
// 设置相关参数
private void setLocationOption() {
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
// 设置坐标类型 ,
option.setCoorType(COOR_TYPE);
option.setServiceName(BAIDU_LOCAL_SDK_SERVICE_NAME);
option.setPoiExtraInfo(true);
// 可以返回地理位置信息,例如“北京市海淀区海淀大街8号”,必须设置all并且是wifi定位的情况下才可以拿到详细地理位置信息
option.setAddrType("all");
option.setScanSpan(SCAN_SPAN_TIME);
option.setPriority(LocationClientOption.NetWorkFirst); // 设置网络优先,不设置,默认是gps优先
option.setPoiNumber(10);
option.disableCache(true);// true表示禁用缓存定位,false表示启用缓存定位
option.setProdName(PRODUCT_NAME);
locationClient.setLocOption(option);
}
public void setDataFeedbackListener(DataFeedbackListener dataFeedbackListener) {
this.dataFeedbackListener = dataFeedbackListener;
}
/**
* 开始定位
* @Title: startLocate
* @return void
* @date 2013-7-2 下午4:32:26
*/
public void startLocate() {
if (locationClient.isStarted()) {
locationClient.requestLocation();
} else {
locationClient.start();
}
}
/**
* 想主动结束定位调用这个方法
* @Title: stopLocate
* @return void
* @date 2013-7-2 下午4:31:12
*/
public void stopLocate() {
if (locationClient.isStarted()) {
locationClient.stop();
}
}
/**
* 定位返回值的监听
* @Package com.baidu.locTest
* @ClassName: LocationListenner
* @author
* @mail
* @date 2013-7-2 下午4:31:49
*/
class LocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null)
return;
if (location.getLatitude() > 0 || location.getLongitude() > 0) {
dataFeedbackListener.onReceiver(location);
locationClient.stop();
} else {
locationClient.requestLocation();
}
}
public void onReceivePoi(BDLocation poiLocation) {
if (poiLocation == null) {
return;
}
}
}
}
然后在我们的某个Activity进行定位请求,处理方式如下:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTv = (TextView)findViewById(R.id.textview);
mStartBtn = (Button)findViewById(R.id.StartBtn);
location = ((LocationApplication)getApplication());
location.setDataFeedbackListener(new DataFeedbackListener(){
@Override
public void onReceiver(BDLocation location) {
// TODO Auto-generated method stub
displayLocation(location);
}
});
//开始定位按钮
mStartBtn.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View v) {
location.startLocate();
}
});
}
private void displayLocation(BDLocation location){
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());
latitude = location.getLatitude();
longitude = location.getLongitude();
Log.d("lzc", "latitude============>" + latitude
+ ", longitude============>" + longitude);
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());
location.getAddrStr();
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
sb.append("\naddr : ");
Log.d("lzc",
"location addr=====================>"
+ location.getAddrStr());
sb.append(location.getAddrStr());
}
sb.append("\nsdk version : ");
//sb.append(mLocClient.getVersion());
sb.append("\nisCellChangeFlag : ");
sb.append(location.isCellChangeFlag());
mTv.setText(sb.toString());
}
有问题交流。