1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > android开发游记:集成百度定位SDK进行实时定位 获取当前城市地理信息

android开发游记:集成百度定位SDK进行实时定位 获取当前城市地理信息

时间:2019-02-17 08:15:06

相关推荐

android开发游记:集成百度定位SDK进行实时定位 获取当前城市地理信息

定位功能在app开发中很常用,大多数企业都是不具备定位资质的,所有一般是通过接入第三方的sdk来进行定位,比较熟悉的有如:百度、高德、谷歌、腾讯等。而国内比较地图策划比较成熟的主要是百度和高德,这里就以百度为例,介绍一下接入流程和方法。

详细资料请查看官方SDK文档:

/map/index.php?title=android-locsdk/guide/v5-0

这里是官方实例代码和SDK下载地址:

BaiduLBS_AndroidSDK_Sample.zip

使用百度定位SDK必须去官网注册开发者账号并申请key:

/map/index.php?title=android-locsdk/guide/key

官方文档把接入方法写的很详细,推荐直接看文档,下面我总结一下接入的流程和遇到的问题:

首先要做的是导入库文件:

下载SDK把SDK中的.so文件及其目录和locSDK_xxx.jar都导入进工程的libs目录下

百度的定位功能和地图功能是分开的,所以只需要引入定位的相关类库就可以了,如下:

不同的目录下都导入了相应的liblocSDK.so是为了兼容执行不同指令集的CPU的机型,这里不需要理解,直接拷贝下去就可以了。

然后设置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>

百度的定位在Service中完成处理的,所以要现在AndroidManifest.xml声明这个Service

<application>节点下添加一个用于定位的后台Service的声明:

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

使用百度定位SDK必须去官网注册开发者账号并申请key,把申请到的key填入AndroidManifest.xml文件中

<application>节点下添加key常量:

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

配置完成了,下面就可以初始化了:

mLocationClient = new LocationClient(this.getApplicationContext());

由于定位功能在app中的各个页面可能都会用到,所以建议把上面的mLocationClient 初始化放在Application中作为全局变量来使用,当然你也可以在每个Activity中都去new一个,但是不建议这样做。

具体设置方法:

新建一个类继承自Application,定义一个公用的LocationClient 并在onCreate中实例化:

public class MyApplication extends Application {public LocationClient mLocationClient;@Overridepublic void onCreate() {super.onCreate();//baidu locmLocationClient = new LocationClient(this.getApplicationContext());}}

然后在自己的Activity中取得这个LocationClient,并设置定位监听:

mLocationClient = ((MyApplication)getApplication()).mLocationClient;mLocationClient.registerLocationListener(new MyLocationListener());

监听器代码示例如下,这里只打印城市展示:

public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {//打印出当前的城市名Toast.makeText(this, location.getCity(), Toast.LENGTH_SHORT).show();//location.getLongitude(); 获取当前位置经度//location.getLatitude();获取当前位置纬度}}

值得注意的是:mLocationClient 是属于Application的全局变量,我们给他注册了一个在本地Activity中声明的定位监听器MyLocationListener,由于Application的生命周期比Activity长,所以在关闭这个页面的时候,mLocationClient 任然持有这个监听对象的引用就会导致该Activity无法释放从而导致内存泄露,虽然运行之后看不出来,但是一旦你重复多次打开关闭定位页面就会发现,app所占用的内存会不断递增直到爆炸应用崩溃。所有还应该做一件事,就是在该页面关闭的时候及时注销这个监听器:

务必在Activity的onDestroy方法中添加如下代码:

@Overrideprotected void onDestroy() {mLocationClient.unRegisterLocationListener(this);//取消注册的位置监听,以免内存泄露mLocationClient.stop();// 退出时销毁定位super.onDestroy();}

到这里,我们初始化了定位类并注册了设置监听,下面我们给定位类设置相应参数后就可以启动定位了:

LocationClientOption option = new LocationClientOption();option.setCoorType("bd09ll"); // 设置坐标类型option.setIsNeedAddress(true); //设置是否需要地址信息,默认不需要//option.setScanSpan(1000);//多久定位一次mLocationClient.setLocOption(option);

注意要获取当前城市必须设option.setIsNeedAddress(true),否则默认为false,获取城市会返回null

option.setScanSpan(1000)表示多久定位一次,0表示只定义一次,默认设置是0,重复定位会加快手机耗电并且影响性能,如果没有实时定位的需要的话,不要设置该属性。

设置完参数后,就可以开始定位了:

mLocationClient.start();

这里功能就集成完毕了,只需要自定义你的定位监听器MyLocationListener 重写其onReceiveLocation(location)方法来执行你自己的逻辑就ok了。

location.getCity(); //获取当前城市名location.getLongitude(); //获取当前位置经度location.getLatitude();//获取当前位置纬度

这里贴出了获取当前城市名和经纬度的方法,其他的请参考官方帮助文档:

http://wiki./cms/androidloc/doc/v6_0_3/doc/index.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。