赞
踩
这个步骤是使用百度定位的首先准备工作,请恕我将其写为最重要的第0号标题。
此步骤可以直接在百度账号登录中去申请,此处。请注意:注册成功后将其升为百度开发者账号。也可以在获取密匙(AK)使将账号进行升级。
登录账号之后,可以在百度地图开发平台个人中心创建应用。
请自行填写。
请选择Android SDK,若是其他类型的项目,请自行选择相关应用类型,此处只详述安卓调用百度定位的使用。
① 打开android stdio的,在软件最下方找到并打开Terminal窗口;
② 输入命令 C:
进入c盘;
③ 接着 输入命令 cd Users\Administrator\.android
其中Administrator
是自己的用户名。
④ 输入命令 keytool -list -v -keystore debug.keystore
其中debug.keystore
是android stdio默认的keystore
,按回车,提示输入密钥库口令:android(系统默认)(或者直接回车,即无口令的情况)
⑤ 得到结果,截屏如下:
①②③ 步骤同开发版SHA1的获取,
④ 打包签名文件,此步骤不会的可以自行百度,此处就不做详述了
⑤ 输入命令 keytool -list -v -keystore 自己的签名文件的全路径
例如我的:keytool -list -v -keystore E:\tiange\androidProject\toSupervision2\ToSupervise\laijiandu.jks
,按回车,提示输入密钥库口令(同上)
⑥ 得到结果,截屏如下:
请在自己项目中的的AndroidManifest.xml
文件中的根元素的package
属性值获取包名。
填写应用信息,点击提交,此时可以在查看应用中看到自己刚刚创建的应用。此时前期的准备工作已经完成准备完毕了,接下来大家就可以跟我在项目中配置相关属性,一起接入百度定位的SDK了。
官网使用教程传送门,本文章已摒弃掉那些无用的文字,不放心的朋友可以通过官网步骤来使用。添加至项目中的文件包括libindoor.so
文件和BaiduLBS_Android.jar
两个配置文件,这两个配置文件可在百度定位开发文档的下载产品直接下载开发包解压中提取这两个文件传送门。我已经将这两个文件放入云盘之中,需要的朋友可以直接获取:传送门 提取码:pfk0
。
文件存放的结构路径如下:
① 请在此文件中的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'
}
打开AndroidManifest.xml
文件,请在application
里面添加子元素:
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="你的AK值" >
</meta-data>
其中AK值可以在你刚创建的应用中获取。
此步骤是非常重要的步骤,由于官网中此步骤是和添加定位权限写在一处,因此特别容易被人忽视,所以我就把它提出来成一个大标题,突出醒目。添加服务代码如下:
<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>
从现在开始就已经能够真正写代码获取本地定位的经纬度了。感谢各位朋友能坚持看到此处。
打开项目的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);
//注册监听函数
}
实现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类中的说明 } }
通过配置参数,可以更加精准适用的进行定位,从而获取到更加准确的数据,此步骤可以在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就可以定位到当前的位置信息了。接下来介绍一下开发过程中遇到的那些坑。
4.9E-324
,4.9E-324
)① 重新检查上述步骤,看是否有所漏掉或使用错误。博主我在开发过程中,也是拉掉了很多东西,从而各种定位失败。
② 定位要在主线程中进行。注意:这个非常重要
③ 安卓6.0 以上的版本需要动态获取权限。这个在官网也有叙述,但动态获取权限需要我们自己来进行获取。
※※※ 这个权限有些朋友可能觉得麻烦,博主我也有个比较简单的方法进行解决,就是build.gradle
文件中将targetSdkVersion
编译的目标版本设置为22或以下即可。但博主并不推荐使用这种方法,只有在制作demo
测试的时候可以偷个懒的手段而已。
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了。感谢各位朋友能坚持看到现在。也希望各位在观看上述材料的时候遇到什么错误与我进行评论,博主一定积极改进。
本博客是博主自己书写,转载请标注作者。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。