美文网首页
百度定位的AS配置以及简单封装

百度定位的AS配置以及简单封装

作者: EraJieZhang | 来源:发表于2018-11-17 21:18 被阅读0次

Api下载地址:http://lbsyun.baidu.com/
自己注册账号下载好api在控制台创建好自己的应用程序 获得到ak值
(AS中SHA1获取方式:点击右侧的gradle,选择你的项目,双击signingReport,sha1码和md5码都会在as的控制台输出,自行分辨debug,和release版本)

111.png

第一步:在build.gradle(module:app)中添加引用

在工程app/libs目录下放入BaiduLBS_Android.jar文件,在src/main/目录下新建jniLibs目录,工程会自动加载src目录下的so文件,放入libBaiduMapSDK_X_vX_X_X.so
注意:Jar文件和so文件的版本号必须一致,并且保证Jar文件与so文件是同一版本包取出的。
在android节点里添加

sourceSets {main {jniLibs.srcDirs = ['libs']}}

dependencies 节点里添加

    implementation files('libs/BaiduLBS_Android.jar')
    implementation fileTree(include: ['*.jar'], dir: 'libs')

第二步:修改AndroidManifest文件

添加权限:

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

第三步:在application节点里声明定位相关信息

<meta-data
        android:name="com.baidu.lbsapi.API_KEY"
        android:value="之前在百度官网申请的AK">
    </meta-data>
    <service
        android:name="com.baidu.location.f"
        android:enabled="true"
        android:process=":remote" />

第四步: 修改Application文件,注册地图sdk

//声明变量
    public Vibrator mVibrator;
    //推荐在oncreate中注册sdk
    mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);
    SDKInitializer.initialize(getApplicationContext());

第五步:新建LocationUtil工具类

/**
 * @author EraJieZhang
 * 百度定位工具
 * eg:
 * LocationUtil.getInstance().getLocationClient(mActivity, new BDAbstractLocationListener() {
 * @Override public void onReceiveLocation(BDLocation location) {
 * if (location != null){
 * if(LocationUtil.getInstance().inSpectLocation(location)){
 * BaseToast.showLongToast(mActivity,"定位成功!");
 * onNext();
 * }else{
 * BaseToast.showLongToast(mActivity,"定位失败!");
 * onErrorNext();
 * }
 * }
 * }
 * }).start();
 * @data 2018/11/13
 */
public class LocationUtil {

    private static final String TAG = "LocationUtil";
    private static final int LOCAION_SUCCESS = 161;

    /**
     * 唯一单例模式
     * @return LocationUtil 实例对象
     */
    private static LocationUtil mInstance;
    private LocationClient mLocationClient = null;
    private LocationClientOption mOption;

    public synchronized static LocationUtil getInstance() {

        if (mInstance == null) {
            mInstance = new LocationUtil();
        }
        return mInstance;
    }


    /**
     * 注册定位,获取定位对象的实例
     * @param context  上下文
     * @param listener 回掉事件
     */
    public LocationClient getLocationClient(Context context, BDAbstractLocationListener listener) {

        mLocationClient = new LocationClient(context);
        /*声明LocationClient类*/
        mLocationClient.registerLocationListener(listener);
        setOption();
        return mLocationClient;
    }

    /**
     * 设置定位参数
     */
    private void setOption() {

        if (mOption == null) {
            mOption = new LocationClientOption();
            /*可选,默认高精度,设置定位模式,高精度,低功耗,仅设备*/
            mOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            /*可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;*/
            mOption.setCoorType("bd09ll");
            /*可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的*/
            mOption.setScanSpan(0);
            /*可选,设置是否需要地址信息,默认不需要*/
            mOption.setIsNeedAddress(true);
            /*可选,设置是否需要地址描述*/
            mOption.setIsNeedLocationDescribe(true);
            /*可选,设置是否需要设备方向结果*/
            mOption.setNeedDeviceDirect(true);
            /*可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果*/
            mOption.setLocationNotify(false);
            /*可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死*/
            mOption.setIgnoreKillProcess(true);
            /*可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”*/
            mOption.setIsNeedLocationDescribe(true);
            /*可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到*/
            mOption.setIsNeedLocationPoiList(true);
            /*可选,默认false,设置是否收集CRASH信息,默认收集*/
            mOption.SetIgnoreCacheException(false);
            /*可选,默认false,设置是否开启Gps定位*/
            mOption.setOpenGps(true);
            /*可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用*/
            mOption.setIsNeedAltitude(false);
        }
        mLocationClient.setLocOption(mOption);
    }

    /**
     * 检查定位点数据
     * @param location location对象
     * @return 数据是否合法{true:合法,false:不合法}
     */
    public boolean inSpectLocation(BDLocation location) {

        boolean isresult = true;
        /*获取纬度信息*/
        double latitude = location.getLatitude();
        /*获取经度信息*/
        double longitude = location.getLongitude();
        /*获取定位精度,默认值为0.0f*/
        float radius = location.getRadius();
        String coorType = location.getCoorType();
        /*获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准*/
        int typeCode = location.getLocType();
        /*获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明*/
        BaseLog.w("纬度信息:" + latitude);
        BaseLog.w("经度信息:" + longitude);
        BaseLog.w("定位精度:" + radius);
        BaseLog.w("坐标类型:" + coorType);
        BaseLog.w("错误码:" + typeCode);


        if (latitude == Double.MIN_VALUE) {
            isresult = false;
            BaseLog.e(TAG, "纬度" + Double.MIN_VALUE + "异常");
        } else if (longitude == Double.MIN_VALUE) {
            isresult = false;
            BaseLog.e(TAG, "经度" + Double.MIN_VALUE + "异常");
        }
        /*
         * 61   GPS定位结果,GPS定位成功
         * 62   无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位
         * 63   网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位
         * 66   离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
         * 68   网络连接失败时,查找本地离线定位时对应的返回结果
         * 161  网络定位结果,网络定位成功
         * 162  请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件
         * 167  服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位
         * 505  AK不存在或者非法,请按照说明文档重新申请AK
         * 按照需求自行判断
         * */
        if (typeCode != LOCAION_SUCCESS) {
            isresult = false;
            BaseLog.e(TAG, "返回码异常:errorCode=" + typeCode);
        }
        BaseLog.e(TAG, "inSpectLocation的返回值:" + isresult);
        return isresult;
    }

}

getLocationClient 注册定位,获取定位对象的实例,设置回掉方法
setOption(私有可自定义) 设置定位参数
inSpectLocation(可自定义) 检查定位点数据

第六步:新建测试activity

获取mLocationClient 实例
掉用mLocationClient.start();方法开始定位
如果是同步定位的 在回掉方法里调用下一步操作
如果是异步定位的 在start之后调用即可

错误码:

在定位结果BDLocation类中,可通过getLocType方法来获取本次定位的错误返回码。各错误返回码的具体说明如下:
返回值 返回值说明
61 GPS定位结果,GPS定位成功
62 无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位
63 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位
66 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
68 网络连接失败时,查找本地离线定位时对应的返回结果
161 网络定位结果,网络定位成功
162 请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件
167 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位
505 AK不存在或者非法,请按照说明文档重新申请AK

Android定位SDK自v7.2版本起,在BDAbstractLocationListener中新增onLocDiagnosticMessage方法,用于细化定位失败原因,开发者可以根据具体原因从产品角度提示用户进行相关操作,达到定位成功的目的,也有助于进一步分析定位失败原因。详细说明如下:

locType diagnosticType diagnosticMessage
161 1 NetWork location successful, open gps will be better!
161 2 NetWork location successful, open wifi will be better!
67 3 Offline location failed, please check the net (wifi/cell)!
62 4 Location failed beacuse we can not get any loc information without any location permission!
62 5 Location failed beacuse we can not get any loc information with the phone loc mode is off, you can turn it on and try again!
62 6 Location failed beacuse we can not get any loc information , you can insert a sim card or open wifi and try again!
62 7 Location failed beacuse we can not get any loc information in airplane mode, you can turn it off and try again!
167 8 NetWork location failed because baidu location service can not caculate the location!
62 9 Location failed beacuse we can not get any loc information!

  1. 如果不能定位,记录错误返回码,并到百度地图开放平台论坛Andriod定位SDK版块中进行交流。

网址:http://bbs.lbsyun.baidu.com/forum.php?mod=forumdisplay&fid=10

  1. 若返回值是162~167,请将错误码、IMEI、定位唯一标识(自v7.2版本起,通过BDLocation.getLocationID方法获取)和定位时间反馈至邮箱loc-bugs@baidu.com,以便我们跟进追查问题。

相关文章

网友评论

      本文标题:百度定位的AS配置以及简单封装

      本文链接:https://www.haomeiwen.com/subject/leiifqtx.html