Android 百度地图 定位 (一)

 

1.下载地址:http://developer.baidu.com/map/index.php?title=android-locsdk/geosdk-android-download

   官方文档:http://developer.baidu.com/map/index.php?title=android-locsdk

2.配置:

   ①key值的获取,在应用管理添加应用时根据提示填写即可,这里我只介绍安全码的获取。

     安全码有三部分:Android签名的sha1 的值 + “;” + packageName 组成;

     Android签名的sha1 值的获取有两种方式:

    一、查看Eclipse获取,这个要求你的adt版本在22以上:

      

   二、通过控制台获取,如图:

      

      密匙库口令默认是android;

       

②把下面包复制到自己工程,如图:

      

 ③AndroidManifest.xml文件配置

  一、权限:

  

<!-- 这个权限用于进行网络定位-->
<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>

 注意:定位SDKv3.1版本之后,以下权限已不需要,请取消声明,否则将由于Android 5.0多帐户系统加强权限管理而导致应用安装失败。 < uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></uses-permission>

     二、声明service组件,每个工程有单独的service,如下:

<service android:name="com.baidu.location.f" 
android:enabled="true"
android:process=":remote"> </service>

      三、添加标签:

<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="key" />       //key:开发者申请的key

 ④.在使用百度地图各项功能之前必须调用SDKInitializer.initialize(getApplicationContext());一般情况我们我将这个方法放入到Application的onCreate方法里调用;

 3.类介绍及相关代码:

 

package com.example.baidumapdemo;


import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;

import android.content.Context;
import android.widget.Toast;

public class BaiduMapLocationUtils implements BDLocationListener{
    private static LocationClient                mLocationClient;        //定位客户端
    private LocationClientOption                mLocationClientOption;    
    
    private Context                             context;
    private String                                currentCity = null;        //当前所在城市
    private boolean                             isFirLoc     = true;        //是否是第一次定位
    private static BaiduMapLocationUtils                mLocationUtils;
    private BaiduMapLocationUtils(Context context){
        init(context);
    }
    public static BaiduMapLocationUtils getInstance(Context context){
        if(mLocationUtils == null){
            mLocationUtils = new BaiduMapLocationUtils(context);
            mLocationClient.start();
        }
        return mLocationUtils;
    }
    /**
     * 初始化数据及定位相关
     * @param context
     */
    public void init(Context context){
        this.context = context;
        mLocationClient = new LocationClient(context);
        mLocationClient.registerLocationListener(this);
        
        mLocationClientOption = new LocationClientOption()
        mLocationClientOption.setCoorType("bd09ll");        //返回坐标类型
        mLocationClientOption.setScanSpan(1000 * 1);        //定位间隔时间
        mLocationClientOption.setAddrType("all");          //是否需要地址信息,默认为false
     mLocationClientOption.SetIgnoreCacheException(false); //可选,默认false,设置是否收集CRASH信息,默认收集
mLocationClientOption.setEnableSimulateGps(false); //可选,默认false,设置是否需要过滤gps仿真结果,默认需要

mLocationClientOption.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
        mLocationClientOption.setOpenGps(true);//可选,默认false,设置是否使用gps
        mLocationClientOption.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
        mLocationClientOption.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
        mLocationClientOption.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
mLocationClientOption.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
mLocationClient.setLocOption(mLocationClientOption); } @Override public void onReceiveLocation(BDLocation location) { if(location == null || location.getCity() == null){ if(isFirLoc){ Toast.makeText(context, "定位失败,错误类型:" + BDLocation.TypeServerError, Toast.LENGTH_SHORT).show(); isFirLoc = false; } return; } if((currentCity == null && location.getCity() != null) || (location.getCity() != null && !location.getCity().equals(currentCity))){ currentCity = location.getCity(); Toast.makeText(context, "当前所在城市:" + currentCity, Toast.LENGTH_SHORT).show(); return; } } public void onReceivePoi(BDLocation location) { } /** * 关闭定位功能 */ public void onStop(){ mLocationClient.stop(); } }

 另:BDLocationListener这个接口的onReceiveLocation返回定位结果,加上上面代码判断即可,下面列出BDLocation相关属性值,以便开发者依据自己需要获取相关数据:

       location.getTime());                          //获取时间

       location.getLocType());                       //定位类型

       location.getLatitude());                       //维度

       location.getLongitude());                     //精度

    如果使用GPS定位还包括一下信息:

       location.getSpeed();          //速度  公里小时

                  location.getAltitude());                          // 单位  米

                  location.getDirection();                        // 单位度
                  location.getAddrStr();
  

  错误码:

获取error code:

public int getLocType ( )

返回值:

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

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

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

65 : 定位缓存的结果。

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

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

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

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

162: 请求串密文解析失败。

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

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

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

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

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

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

如果不能定位,请记住这个返回值,并到百度LBS开放平台论坛Andriod定位SDK版块中进行交流http://bbs.lbsyun.baidu.com/forum.php?mod=forumdisplay&fid=10 。若返回值是162~167,请将错误码、imei和定位时间反馈至loc-bugs@baidu.com,以便我们跟进追查问题

在这里类里我仅封装了定位部分,配置完成之后在onCreate里直接调用即可实现定位功能,我会稍后介绍在地图上标记位置。

 

posted @ 2015-10-22 16:53  还没好好感受年轻  阅读(4381)  评论(0编辑  收藏  举报