详述安卓百度定位的使用步骤以及使用过程中的那些坑

0 准备工作

这个步骤是使用百度定位的首先准备工作,请恕我将其写为最重要的第0号标题。

0.1 申请百度账号

此步骤可以直接在百度账号登录中去申请,此处。请注意:注册成功后将其升为百度开发者账号。也可以在获取密匙(AK)使将账号进行升级。

0.2 创建应用app

登录账号之后,可以在百度地图开发平台个人中心创建应用

0.2.1 应用名称

请自行填写。

0.2.2 应用类型

请选择Android SDK,若是其他类型的项目,请自行选择相关应用类型,此处只详述安卓调用百度定位的使用。

0.2.3 开发版SHA1

① 打开android stdio的,在软件最下方找到并打开Terminal窗口;

② 输入命令 C: 进入c盘;

③ 接着 输入命令 cd Users\Administrator\.android 其中Administrator是自己的用户名。

④ 输入命令 keytool -list -v -keystore debug.keystore 其中debug.keystore是android stdio默认的keystore,按回车,提示输入密钥库口令:android(系统默认)(或者直接回车,即无口令的情况)

⑤ 得到结果,截屏如下:

在这里插入图片描述

在这里插入图片描述

0.2.4 发布版SHA1

①②③ 步骤同开发版SHA1的获取,

④ 打包签名文件,此步骤不会的可以自行百度,此处就不做详述了

⑤ 输入命令 keytool -list -v -keystore 自己的签名文件的全路径 例如我的:keytool -list -v -keystore E:\tiange\androidProject\toSupervision2\ToSupervise\laijiandu.jks,按回车,提示输入密钥库口令(同上)

⑥ 得到结果,截屏如下:

在这里插入图片描述

在这里插入图片描述

0.2.5 包名

请在自己项目中的的AndroidManifest.xml文件中的根元素的package属性值获取包名。

0.2.6 创建应用完成

填写应用信息,点击提交,此时可以在查看应用中看到自己刚刚创建的应用。此时前期的准备工作已经完成准备完毕了,接下来大家就可以跟我在项目中配置相关属性,一起接入百度定位的SDK了。

1 Android studio配置

1.1 添加百度地图SDK

官网使用教程传送门,本文章已摒弃掉那些无用的文字,不放心的朋友可以通过官网步骤来使用。添加至项目中的文件包括libindoor.so文件和BaiduLBS_Android.jar两个配置文件,这两个配置文件可在百度定位开发文档的下载产品直接下载开发包解压中提取这两个文件传送门。我已经将这两个文件放入云盘之中,需要的朋友可以直接获取:传送门 提取码:pfk0

文件存放的结构路径如下:

在这里插入图片描述

1.2 配置build.gradle文件

① 请在此文件中的android属性下添加:

sourceSets{
        main{
                 jnilibs.srcDir 'libs'
                 jni.srcDirs = []    //disable automatic ndk-build
         }
}

② 请在此文件的dependencies属性下添加:

dependencies {
        compile fileTree(dir:  'libs' , include: ['*.jar'])
        androidTestCompile ('com.android.support.test.espresso: espresso-core: 2.2.2', {
                  exclude group: 'com.android.support',  module: 'support-annotations'
         })
        compile 'com.android.support: appcompat-v7:25.1.0'
        testCompile 'junit: junit: 4.12'
}
1.3 添加AK

打开AndroidManifest.xml文件,请在application里面添加子元素:

<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="你的AK值" >
</meta-data>

其中AK值可以在你刚创建的应用中获取

1.4 声明service组件

此步骤是非常重要的步骤,由于官网中此步骤是和添加定位权限写在一处,因此特别容易被人忽视,所以我就把它提出来成一个大标题,突出醒目。添加服务代码如下:

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
1.5 添加定位权限

这个应该是最基础的步骤了,添加的权限如下:

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

2 定位获取经纬度

从现在开始就已经能够真正写代码获取本地定位的经纬度了。感谢各位朋友能坚持看到此处。

2.1 初始化LocationClient类

打开项目的application类(若没有重写此application,则新建一个application进行重写,并在AndroidManifest.xml中进行配置),在主线程中声明LocationClient类对象,该对象初始化需传入Context类型参数。其核心代码如下:

public LocationClient mLocationClient = null;
private MyLocationListener myListener = new MyLocationListener();
//BDAbstractLocationListener为7.2版本新增的Abstract类型的监听接口
//原有BDLocationListener接口暂时同步保留。具体介绍请参考后文第四步的说明
public void onCreate() {
    mLocationClient = new LocationClient(getApplicationContext());     
    //声明LocationClient类
    mLocationClient.registerLocationListener(myListener);    
    //注册监听函数
}
2.2 实现BDAbstractLocationListener接口

实现BDAbstractLocationListener接口,此时可以从此接口中获取到定位的相关信息,核心代码如下:

实现BDAbstractLocationListener接口public class MyLocationListener implements BDAbstractLocationListener{
    @Override
    public void onReceiveLocation(BDLocation location){
        //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
        //以下只列举部分获取经纬度相关(常用)的结果信息
        //更多结果信息获取说明,请参照类参考中BDLocation类中的说明
			
        double latitude = location.getLatitude();    //获取纬度信息
        double longitude = location.getLongitude();    //获取经度信息
        float radius = location.getRadius();    //获取定位精度,默认值为0.0f
			
        String coorType = location.getCoorType();
        //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
			
        int errorCode = location.getLocType();
        //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
    }
}
2.3 配置定位SDK参数并开始定位

通过配置参数,可以更加精准适用的进行定位,从而获取到更加准确的数据,此步骤可以在application中进行配置并开始定位,也以在activity中进行配置并开始定位。其核心代码如下:

LocationClientOption option = new LocationClientOption();

option.setLocationMode(LocationMode.Hight_Accuracy);
//可选,设置定位模式,默认高精度
//LocationMode.Hight_Accuracy:高精度;
//LocationMode. Battery_Saving:低功耗;
//LocationMode. Device_Sensors:仅使用设备;
	
option.setCoorType("bd09ll");
//可选,设置返回经纬度坐标类型,默认GCJ02
//GCJ02:国测局坐标;
//BD09ll:百度经纬度坐标;
//BD09:百度墨卡托坐标;
//海外地区定位,无需设置坐标类型,统一返回WGS84类型坐标
 	
option.setScanSpan(1000);
//可选,设置发起定位请求的间隔,int类型,单位ms
//如果设置为0,则代表单次定位,即仅定位一次,默认为0
//如果设置非0,需设置1000ms以上才有效
	
option.setOpenGps(true);
//可选,设置是否使用gps,默认false
//使用高精度和仅用设备两种定位模式的,参数必须设置为true
	
option.setLocationNotify(true);
//可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
	
option.setIgnoreKillProcess(false);
//可选,定位SDK内部是一个service,并放到了独立进程。
//设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
	
option.SetIgnoreCacheException(false);
//可选,设置是否收集Crash信息,默认收集,即参数为false

option.setWifiCacheTimeOut(5*60*1000);
//可选,V7.2版本新增能力
//如果设置了该接口,首次启动定位时,会先判断当前Wi-Fi是否超出有效期,若超出有效期,会先重新扫描Wi-Fi,然后定位
	
option.setEnableSimulateGps(false);
//可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
	
mLocationClient.setLocOption(option);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明

配置完成之后开始定位,其核心代码如下:

mLocationClient.start();
//mLocationClient为第二步初始化过的LocationClient对象
//调用LocationClient的start()方法,便可发起定位请求

此时,app就可以定位到当前的位置信息了。接下来介绍一下开发过程中遇到的那些坑。

3 定位过程中的那些坑

3.1 定位失败,无法获取定位的经纬度(定位出错经纬度:4.9E-324,4.9E-324

① 重新检查上述步骤,看是否有所漏掉或使用错误。博主我在开发过程中,也是拉掉了很多东西,从而各种定位失败。

② 定位要在主线程中进行。注意:这个非常重要

③ 安卓6.0 以上的版本需要动态获取权限。这个在官网也有叙述,但动态获取权限需要我们自己来进行获取。

​ ※※※ 这个权限有些朋友可能觉得麻烦,博主我也有个比较简单的方法进行解决,就是build.gradle文件中将targetSdkVersion编译的目标版本设置为22或以下即可。但博主并不推荐使用这种方法,只有在制作demo测试的时候可以偷个懒的手段而已。

3.2 MyLocationListener定位监听器无法获取定位城市

可以通过经纬度调用百度的位置接口http://api.map.baidu.com/geocoder?output=json&location=纬度值,经度值&ak=你的应用AK来获取定位的城市,其中经纬度的值可以从MyLocationListener中进行获取,AK值可以在你刚创建的应用中获取

例如博主的测试地址:http://api.map.baidu.com/geocoder?output=json&location=29.593207%2C106.322435&ak=HZvLR5GCk2KTCXc9Te0GznVzRQE1Pjvf,即可以获取到位置信息,返回的json格式如下:

{
    "status":"OK",
    "result":{
        "location":{
            "lng":106.322435,
            "lat":29.593207
        },
        "formatted_address":"重庆市沙坪坝区思贤路",
        "business":"虎溪",
        "addressComponent":{
            "city":"重庆市",
            "direction":"",
            "distance":"",
            "district":"沙坪坝区",
            "province":"重庆市",
            "street":"思贤路",
            "street_number":""
        },
        "cityCode":132
    }
}

得到定位城市之后,大家就可以自行使用了。

至此即百度定位的使用大概就ok了。感谢各位朋友能坚持看到现在。也希望各位在观看上述材料的时候遇到什么错误与我进行评论,博主一定积极改进。

本博客是博主自己书写,转载请标注作者。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值