天天看点

百度地图定位功能的使用

前期准备

  • 申请秘钥

    http://lbsyun.baidu.com/apiconsole/key

    百度地图定位功能的使用
    百度地图定位功能的使用
    百度地图定位功能的使用
    百度地图定位功能的使用
    百度地图定位功能的使用
    百度地图定位功能的使用
    百度地图定位功能的使用
    百度地图定位功能的使用
    百度地图定位功能的使用
    百度地图定位功能的使用
  • 配置环境
    • 下载SDK定位SDK,将jar包和so库拷贝到项目中
    • 使用Studio开发的人员,在build.gradle中添加以下代码
    sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
    }
               
    • 清单文件声明
    <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
    </service>
               
    • 权限声明
    <!-- 这个权限用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!-- 这个权限用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!-- 用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!-- 访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SD卡读取权限,用户写入离线定位数据-->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
               
    • 设置AcessKey
    <meta-data
                android:name="com.baidu.lbsapi.API_KEY"
                android:value="AK" />       //key:开发者申请的Key
               
  • 核心代码
    • 初始化LocationClient
    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyLocationListener();
    
    public void onCreate() {
        //声明LocationClient类
        mLocationClient = new LocationClient(getApplicationContext());     
        //注册监听函数
        mLocationClient.registerLocationListener( myListener );    
    }
               
    • 配置参数

      设置定位参数包括:定位模式(高精度定位模式、低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。

      返回坐标类型包括:

      1. gcj02:国测局坐标;
      2. bd09:百度墨卡托坐标;
      3. bd09ll:百度经纬度坐标;

        注意:海外地区定位结果默认、且只能是WGS84类型坐标。

    private void initLocation(){
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy);
        //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
    
        option.setCoorType("bd09ll");
        //可选,默认gcj02,设置返回的定位结果坐标系
    
        int span=;
        option.setScanSpan(span);
        //可选,默认,即仅定位一次,设置发起定位请求的间隔需要大于等于ms才是有效的
    
        option.setIsNeedAddress(true);
        //可选,设置是否需要地址信息,默认不需要
    
        option.setOpenGps(true);
        //可选,默认false,设置是否使用gps
    
        option.setLocationNotify(true);
        //可选,默认false,设置是否当GPS有效时按照S/次频率输出GPS结果
    
        option.setIsNeedLocationDescribe(true);
        //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
    
        option.setIsNeedLocationPoiList(true);
        //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
    
        option.setIgnoreKillProcess(false);
        //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死  
    
        option.SetIgnoreCacheException(false);
        //可选,默认false,设置是否收集CRASH信息,默认收集
    
        option.setEnableSimulateGps(false);
        //可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
    
        mLocationClient.setLocOption(option);
    }
               

    高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;

    低功耗定位模式:这种定位模式下,不会使用GPS进行定位,只会使用网络定位(WiFi定位和基站定位);

    仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。

    • 位置回调
    public class MyLocationListener implements BDLocationListener {
    
    @Override
    public void onReceiveLocation(BDLocation location) {
    
        //获取定位结果
        StringBuffer sb = new StringBuffer);
    
        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){
    
            // GPS定位结果
            sb.append("\nspeed : ");
            sb.append(location.getSpeed());    // 单位:公里每小时
    
            sb.append("\nsatellite : ");
            sb.append(location.getSatelliteNumber());    //获取卫星数
    
            sb.append("\nheight : ");
            sb.append(location.getAltitude());    //获取海拔高度信息,单位米
    
            sb.append("\ndirection : ");
            sb.append(location.getDirection());    //获取方向信息,单位度
    
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());    //获取地址信息
    
            sb.append("\ndescribe : ");
            sb.append("gps定位成功");
    
        } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
    
            // 网络定位结果
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());    //获取地址信息
    
            sb.append("\noperationers : ");
            sb.append(location.getOperators());    //获取运营商信息
    
            sb.append("\ndescribe : ");
            sb.append("网络定位成功");
    
        } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
    
            // 离线定位结果
            sb.append("\ndescribe : ");
            sb.append("离线定位成功,离线定位结果也是有效的");
    
        } else if (location.getLocType() == BDLocation.TypeServerError) {
    
            sb.append("\ndescribe : ");
            sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到[email protected],会有人追查原因");
    
        } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
    
            sb.append("\ndescribe : ");
            sb.append("网络不同导致定位失败,请检查网络是否通畅");
    
        } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
    
            sb.append("\ndescribe : ");
            sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
    
        }
    
        sb.append("\nlocationdescribe : ");
        sb.append(location.getLocationDescribe());    //位置语义化信息
    
        List<Poi> list = location.getPoiList();    // POI数据
        if (list != null) {
            sb.append("\npoilist size = : ");
            sb.append(list.size());
            for (Poi p : list) {
                sb.append("\npoi= : ");
                sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
            }
        }
    
        Log.i("BaiduLocationApiDem", sb.toString());
    }
    @Override
    public void onConnectHotSpotMessage(String s, int i) {
    
    }
    }
               

    返回值:

    61 : GPS定位结果,GPS定位成功。

    62 : 无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位。

    63 : 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位。

    65 : 定位缓存的结果。

    66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。

    67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。

    68 : 网络连接失败时,查找本地离线定位时对应的返回结果。

    161: 网络定位结果,网络定位成功。

    162: 请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件。

    167: 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位。

    502: AK参数错误,请按照说明文档重新申请AK。

    505:AK不存在或者非法,请按照说明文档重新申请AK。

    601: AK服务被开发者自己禁用,请按照说明文档重新申请AK。

    602: key mcode不匹配,您的AK配置过程中安全码设置有问题,请确保:SHA1正确,“;”分号是英文状态;且包名是您当前运行应用的包名,请按照说明文档重新申请AK。

    501~700:AK验证失败,请按照说明文档重新申请AK。

    • 开启定位

    start:启动定位SDK。 stop:关闭定位SDK。调用start之后只需要等待定位结果自动回调即可。

    开发者定位场景如果是单次定位的场景,在收到定位结果之后直接调用stop函数即可。

    如果stop之后仍然想进行定位,可以再次start等待定位结果回调即可。

    如果开发者想按照自己逻辑请求定位,可以在start之后按照自己的逻辑请求locationclient.requestLocation()函数,会主动触发定位SDK内部定位逻辑,等待定位回调即可。

    • 位置提醒功能

      位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。

    //位置提醒相关代码
    mNotifyer = new NotifyLister();
    
    mNotifyer.SetNotifyLocation(,,,"gps");
    //4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)
    
    mLocationClient.registerNotify(mNotifyer);
    //注册位置提醒监听事件后,可以通过SetNotifyLocation 来修改位置提醒设置,修改后立刻生效。
    
    //BDNotifyListner实现
    public class NotifyLister extends BDNotifyListener{
    
        public void onNotify(BDLocation mlocation, float distance){
    
            mVibrator01.vibrate();
            //振动提醒已到设定位置附近
        }
    }
    
    //取消位置提醒
    mLocationClient.removeNotifyEvent(mNotifyer);
               

效果图:

百度地图定位功能的使用

继续阅读