http://blog.csdn.net/android_ls/article/details/8583437
在上一篇的基础上(Android百度地图之定位SDK(v3.1)使用示例(一))浅谈在室外使用百度地图定位服务。
一、在户外使用GPS定位,修改LocationClient对象的属性即可,我在下班的路上测了下,定位结果比较准确。
1、修改LocationClientOption对象的属性,也就是修改了LocationClient对象的mLocationClient.setLocOption(option);属性。
LocationClientOptionoption=newLocationClientOption();//需要地址信息,设置为其他任何值(string类型,且不能为null)时,都表示无地址信息。option.setAddrType("all");//设置是否返回POI的电话和地址等详细信息。默认值为false,即不返回POI的电话和地址信息。option.setPoiExtraInfo(true);//设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。option.setProdName("通过GPS定位我当前的位置");//打开GPS,使用gps前提是用户硬件打开gps。默认是不打开gps的。option.setOpenGps(true);//定位的时间间隔,单位:ms//当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。//option.setScanSpan(1000);//查询范围,默认值为500,即以当前定位位置为中心的半径大小。option.setPoiDistance(500);//禁用启用缓存定位数据option.disableCache(true);//坐标系类型,百度手机地图对外接口中的坐标系默认是bd09lloption.setCoorType("bd09ll");//设置最多可返回的POI个数,默认值为3。由于POI查询比较耗费流量,设置最多返回的POI个数,以便节省流量。option.setPoiNumber(3);//设置定位方式的优先级。//当gps可用,而且获取了定位结果时,不再发起网络请求,直接返回给用户坐标。这个选项适合希望得到准确坐标位置的用户。如果gps不可用,再发起网络请求,进行定位。option.setPriority(LocationClientOption.GpsFirst);2、与上一篇里的属性设置差别:
//设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。option.setProdName("通过GPS定位我当前的位置");//打开GPS,使用gps前提是用户硬件打开gps。默认是不打开gps的。option.setOpenGps(true);//设置定位方式的优先级。//当gps可用,而且获取了定位结果时,不再发起网络请求,直接返回给用户坐标。这个选项适合希望得到准确坐标位置的用户。如果gps不可用,再发起网络请求,进行定位。option.setPriority(LocationClientOption.GpsFirst);
二、设置定位时间间隔:
百度API里的说明:
1、当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。调用requestLocation()后,每隔设定的时间,定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。定时定位时,调用一次requestLocation,会定时监听到定位结果。
2、当不设此项,或者所设的整数值小于1000(ms)时,采用一次定位模式。每调用一次requestLocation(),定位SDK会发起一次定位。请求定位与监听结果一一对应。
3、设定了定时定位后,可以热切换成一次定位,需要重新设置时间间隔小于1000(ms)即可。locationClient对象stop后,将不再进行定位。如果设定了定时定位模式后,多次调用requestLocation(),则是每隔一段时间进行一次定位,同时额外的定位请求也会进行定位,但频率不会超过1秒一次。
我实际调用了下,LocationClientOption对象其它属性设置不变。当所设的整数值大于等于1000(ms)时,会每隔设定的时间就重新定位一次。
//定位的时间间隔,单位:ms//当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。option.setScanSpan(1000);三、完整代码:
packagecom.android.baidu.map;importandroid.app.Activity;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.widget.TextView;importcom.baidu.location.BDLocation;importcom.baidu.location.BDLocationListener;importcom.baidu.location.LocationClient;importcom.baidu.location.LocationClientOption;/***通过GPS定位获取值*@authorandroid_ls**/publicclassBaiduMapLoaction2ActivityextendsActivity{privatestaticfinalStringTAG="BaiduMapLoactionActivity";privateLocationClientmLocationClient;privateMyBDLocationListenermBDLocationListener;privateTextViewmContent;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);mLocationClient=newLocationClient(this.getApplicationContext());mBDLocationListener=newMyBDLocationListener();mLocationClient.registerLocationListener(mBDLocationListener);LocationClientOptionoption=newLocationClientOption();//需要地址信息,设置为其他任何值(string类型,且不能为null)时,都表示无地址信息。option.setAddrType("all");//设置是否返回POI的电话和地址等详细信息。默认值为false,即不返回POI的电话和地址信息。option.setPoiExtraInfo(true);//设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。option.setProdName("通过GPS定位我当前的位置");//打开GPS,使用gps前提是用户硬件打开gps。默认是不打开gps的。option.setOpenGps(true);//定位的时间间隔,单位:ms//当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。//option.setScanSpan(1000);//查询范围,默认值为500,即以当前定位位置为中心的半径大小。option.setPoiDistance(500);//禁用启用缓存定位数据option.disableCache(true);//坐标系类型,百度手机地图对外接口中的坐标系默认是bd09lloption.setCoorType("bd09ll");//设置最多可返回的POI个数,默认值为3。由于POI查询比较耗费流量,设置最多返回的POI个数,以便节省流量。option.setPoiNumber(3);//设置定位方式的优先级。//当gps可用,而且获取了定位结果时,不再发起网络请求,直接返回给用户坐标。这个选项适合希望得到准确坐标位置的用户。如果gps不可用,再发起网络请求,进行定位。option.setPriority(LocationClientOption.GpsFirst);mLocationClient.setLocOption(option);mContent=(TextView)this.findViewById(R.id.tv_content);//发起定位请求findViewById(R.id.btn_request).setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){mLocationClient.start();}});//重新定位findViewById(R.id.btn_location).setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){if(mLocationClient!=null&&mLocationClient.isStarted())mLocationClient.requestLocation();}});//发起查询请求findViewById(R.id.btn_address).setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){if(mLocationClient!=null&&mLocationClient.isStarted())mLocationClient.requestPoi();}});}finalclassMyBDLocationListenerimplementsBDLocationListener{@OverridepublicvoidonReceiveLocation(BDLocationlocation){Log.e(TAG,"---------onReceiveLocation()---------");if(location==null){Log.e(TAG,"---------onReceiveLocation------locationisNULL----");return;}inttype=location.getLocType();Log.i(TAG,"当前定位采用的类型是:type="+type);StringcoorType=location.getCoorType();Log.i(TAG,"坐标系类型:coorType="+coorType);//判断是否有定位精度半径if(location.hasRadius()){//获取定位精度半径,单位是米floataccuracy=location.getRadius();Log.i(TAG,"accuracy="+accuracy);}if(location.hasAddr()){//获取反地理编码。只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。Stringaddress=location.getAddrStr();Log.i(TAG,"address="+address);}Stringprovince=location.getProvince();//获取省份信息Stringcity=location.getCity();//获取城市信息Stringdistrict=location.getDistrict();//获取区县信息Log.i(TAG,"province="+province);Log.i(TAG,"city="+city);Log.i(TAG,"district="+district);doublelatitude=location.getLatitude();doublelongitude=location.getLongitude();Log.i(TAG,"latitude="+latitude);Log.i(TAG,"longitude="+longitude);StringBuffersb=newStringBuffer(256);sb.append("time:");sb.append(location.getTime());sb.append("\nerrorcode:");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());}elseif(location.getLocType()==BDLocation.TypeNetWorkLocation){sb.append("\naddr:");sb.append(location.getAddrStr());}mContent.setText(sb);}@OverridepublicvoidonReceivePoi(BDLocationpoiLocation){Log.e(TAG,"---------onReceivePoi()---------");if(poiLocation==null){Log.e(TAG,"---------onReceivePoi------locationisNULL----");return;}if(poiLocation.hasPoi()){StringpoiStr=poiLocation.getPoi();Log.i(TAG,"poiStr="+poiStr);}if(poiLocation.hasAddr()){//获取反地理编码。只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。Stringaddress=poiLocation.getAddrStr();Log.i(TAG,"address="+address);}StringBuffersb=newStringBuffer(256);sb.append("Poitime:");sb.append(poiLocation.getTime());sb.append("\nerrorcode:");sb.append(poiLocation.getLocType());sb.append("\nlatitude:");sb.append(poiLocation.getLatitude());sb.append("\nlontitude:");sb.append(poiLocation.getLongitude());sb.append("\nradius:");sb.append(poiLocation.getRadius());if(poiLocation.getLocType()==BDLocation.TypeNetWorkLocation){sb.append("\naddr:");sb.append(poiLocation.getAddrStr());}if(poiLocation.hasPoi()){sb.append("\nPoi:");sb.append(poiLocation.getPoi());}else{sb.append("noPoiinformation");}mContent.setText(sb);}}@OverrideprotectedvoidonDestroy(){if(mLocationClient!=null&&mLocationClient.isStarted()){if(mBDLocationListener!=null){mLocationClient.unRegisterLocationListener(mBDLocationListener);}mLocationClient.stop();mLocationClient=null;}super.onDestroy();}}
原文来自:雨枫技术教程网http://www.fengfly.com
原文网址:http://www.fengfly.com/plus/view-212238-2.html
原文来自:雨枫技术教程网http://www.fengfly.com
原文网址:http://www.fengfly.com/plus/view-212238-1.html