在上一篇的基础上(百度地图定位SDK(版本v3.1)(一))浅谈在室外使用百度地图定位服务。

一、在户外使用GPS定位,修改LocationClient对象的属性即可,我在下班的路上测了下,定位结果比较准确。

1、修改LocationClientOption对象的属性,也就是修改了LocationClient对象的mLocationClient.setLocOption(option);属性。

   LocationClientOption option = new LocationClientOption();               // 需要地址信息,设置为其他任何值(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);                // 坐标系类型,百度手机地图对外接口中的坐标系默认是bd09ll        option.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);

三、完整代码:

package com.android.baidu.map;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.TextView;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;/** * 通过GPS定位获取值 * @author android_ls * */public class BaiduMapLoaction2Activity extends Activity {   private static final String TAG = "BaiduMapLoactionActivity";private LocationClient mLocationClient;private MyBDLocationListener mBDLocationListener;private TextView mContent;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                mLocationClient = new LocationClient(this.getApplicationContext());                mBDLocationListener = new MyBDLocationListener();        mLocationClient.registerLocationListener(mBDLocationListener);                LocationClientOption option = new LocationClientOption();               // 需要地址信息,设置为其他任何值(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);                // 坐标系类型,百度手机地图对外接口中的坐标系默认是bd09ll        option.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(new View.OnClickListener() {@Overridepublic void onClick(View v) { mLocationClient.start();}});                        // 重新定位         findViewById(R.id.btn_location).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mLocationClient != null && mLocationClient.isStarted())  mLocationClient.requestLocation();}});                 // 发起查询请求         findViewById(R.id.btn_address).setOnClickListener(new View.OnClickListener() {  @Override public void onClick(View v) {  if (mLocationClient != null && mLocationClient.isStarted()) mLocationClient.requestPoi(); } });             }            final class MyBDLocationListener implements BDLocationListener{@Overridepublic void onReceiveLocation(BDLocation location) {Log.e(TAG, "---------onReceiveLocation()---------");if(location == null){Log.e(TAG, "---------onReceiveLocation------location is NULL----");return;}int type = location.getLocType();Log.i(TAG, "当前定位采用的类型是:type = " + type);String coorType = location.getCoorType();Log.i(TAG, "坐标系类型:coorType = " + coorType);   // 判断是否有定位精度半径            if(location.hasRadius()){            // 获取定位精度半径,单位是米            float accuracy = location.getRadius();            Log.i(TAG, "accuracy = " + accuracy);            }            if(location.hasAddr()){// 获取反地理编码。 只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。String address = location.getAddrStr();Log.i(TAG, "address = " + address);}                        String province = location.getProvince();  // 获取省份信息            String city = location.getCity();  // 获取城市信息            String district = location.getDistrict(); // 获取区县信息                        Log.i(TAG, "province = " + province);            Log.i(TAG, "city = " + city);            Log.i(TAG, "district = " + district);                        double latitude = location.getLatitude();            double longitude = location.getLongitude();            Log.i(TAG, "latitude = " + latitude);            Log.i(TAG, "longitude = " + longitude);                        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());    }                      mContent.setText(sb);}@Overridepublic void onReceivePoi(BDLocation poiLocation) {Log.e(TAG, "---------onReceivePoi()---------");if(poiLocation == null){Log.e(TAG, "---------onReceivePoi------location is NULL----");return;}if(poiLocation.hasPoi()){String poiStr = poiLocation.getPoi();Log.i(TAG, "poiStr = " + poiStr);}if(poiLocation.hasAddr()){// 获取反地理编码。 只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。String address = poiLocation.getAddrStr();Log.i(TAG, "address = " + address);}StringBuffer sb = new StringBuffer(256);sb.append("Poi time : ");sb.append(poiLocation.getTime());sb.append("\nerror code : ");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("noPoi information");}mContent.setText(sb);}        }        @Override    protected void onDestroy() {    if(mLocationClient != null && mLocationClient.isStarted()){    if(mBDLocationListener != null){        mLocationClient.unRegisterLocationListener(mBDLocationListener);        }            mLocationClient.stop();        mLocationClient = null;    }            super.onDestroy();    }        }

更多相关文章

  1. Android 判断应用程序安装位置
  2. Android四大布局之表格布局行列位置控制
  3. 自定义View学习笔记(二)-Android坐标系简介
  4. android:layout_alignParent 布局相对于父布局的位置
  5. 第五课--位置布局
  6. Android文件存储位置简述
  7. Android自定义Toast的时长、位置、及显示的View
  8. android 6.0锁屏界面时间位置修改

随机推荐

  1. Android实践 -- 监听外置sdcard(TF卡)的
  2. quick cocos2d-x 与android实现更换头像
  3. EditText自动弹出软键盘的原因及解决方法
  4. 【Android(安卓)SDK 开发】安卓开发常用
  5. Android(安卓)JNI 高级篇
  6. Android(安卓)Studio AIDL创建案例(解决自
  7. Android中万能的BaseAdapter(Spinner,Lis
  8. Android.mk超全详细用法
  9. android-async-http如何使用
  10. [Android]四种方式解析字符串----JSON、S