日照市东港区创新电子技术中心
ndfweb.cn

[转]Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息


2021-04-30 14:25:29 (3565)


本文主要介绍了Android项目集成百度地图API,使用AlarmManager定时调用Service,在Service中请求坐标更新,并通过坐标得到省、市和县三级地理位置信息的方法。

程序结构很简单,先做简单介绍,后面详细说明:

  1. MainActivity.java是创建项目自带的,不用管;

  2. BMapApiDemoApp.java是大部分是百度自带demo文件没有改动,只是在里面添加了Alarm相关的代码;

  3. GetLocationService.java是Alarm启动的Service类,在这个类中请求位置更新;

  4. GeoCoderParser.java是用于接收地理位置信息的回调类。

百度地图API

集成百度地图API的方式很简单,可以上官网http://developer.baidu.com/map/sdk-android.htm下载相应的库文件和demo。具体的集成方法这里不再赘述,仅仅讨论一下BMapApiDemoApp这个类。代码如下:

View Code

主要关注如下几点:

  1. BMapApiDemoApp覆盖了Application类,并在onCreate()函数中初始化BMapManager对象,这样程序就可以共享这个对象。

  2. BMapManager类主要有4个函数,init(), start(), stop() 和destory()。一般在Application类的onCreate()函数中调用init,在onDestory()函数中调用destory,这样在需要使用其他API的地方只需要取到这个对象并调用start和stop方法就可以了。但是为了保证BMapManager对象存在,在其他调用的类中还是会做相应的检查。

  3. 文件中变量mStrKey保存的是需要去官网申请的API的key,申请很容易。

  4. 我在onCreate()函数中还调用了startAlarm()函数。这个函数的作用是每隔10s调用GetLocationService类。

GetLocationService

GetLocationService主要覆写了两个函数onStartCommand()和onCreate(),代码如下:

View Code

其中:

  1. 在onCreate()中取到在BMapApiDemoApp里定义的BMapManager对象,并检查是否存在,不存在就初始化一个;

  2. 在onStartCommand()中注册LocationListener并调用BMapManager的start函数;

  3. LocationListener是在onCreate()中定义的,mMKSearch.reverseGeocode()传入GeoPoint对象,搜索之后的返回值通过GeoCoderParser类取到;当得到Location信息之后我调用了removeUpdates和stop函数停止请求更新。

1 GeoPoint point = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6));2 mMKSearch.reverseGeocode(point);3                     4 app.mBMapMan.getLocationManager().removeUpdates(mLocationListener);5 app.mBMapMan.stop();

代码最后执行的时候有一个小bug就是removeUpdate()貌似被执行了两次,没有详细追究,不知道是什么原因。不过也无伤大雅。

GeoCoderParser

最后就是用于接收MKSearch.reverseGeocode()结果的类。

这个类的实现了MKSearchListener接口,接口的函数比较多,但是我们这里只关注onGetAddrResult(MKAddrInfo arg0, int arg1)函数。这个函数有两个参数:

  1. arg1是错误码,搜索失败的时候通过错误码得到失败原因;

  2. arg0是传入的地址信息,它是一个MKAddrInfo对象,对象有个字段是addressComponents,这个字段保存了从省、市一直到门牌号的信息。

复制代码

 1 public class GeoCoderParser implements MKSearchListener { 2  3     private static final String TAG = "GeoCoderParser"; 4  5     @Override 6     public void onGetAddrResult(MKAddrInfo arg0, int arg1) { 7         if (arg1 != 0) { 8             String str = String.format("%d", arg1); 9             Log.d(TAG, str);10             return;11         }12         MKGeocoderAddressComponent address = arg0.addressComponents;13         Log.d(TAG, "Location info:" + address.province + address.city + address.district);14     }15 16     //other functions17 18 }

复制代码

项目代码没什么特殊的地方,主要注意一下Manifest文件里面请求相应的权限和注册Service就行了。


了解更多请访问:http://www.ndfweb.cn/news-841.html
  NDF俱乐部
  国际域名注册
  建站咨询
合作伙伴:万网 | 新网 | 新网互联 NDF网站建设淘宝店 | 实用工具 | 外貿網站建設 | 联系我们
鲁公网安备 37110202000336号 Sitemap - RSSRSS订阅