使用百度地图定位SDK获取定位信息。

            最近了解了下百度地图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());
    }

有问题交流。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值