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

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

MainActivity.java是创建项目自带的,不用管; BMapApiDemoApp.java是大部分是百度自带demo文件没有改动,只是在里面添加了Alarm相关的代码; GetLocationService.java是Alarm启动的Service类,在这个类中请求位置更新; GeoCoderParser.java是用于接收地理位置信息的回调类。 百度地图API

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

 public class BMapApiDemoApp extends Application {

      private static final String TAG = "BMapApiDemoApp";

      static BMapApiDemoApp mDemoApp;

      BMapManager mBMapMan = null;

      String mStrKey = "Your key here!!";
boolean m_bKeyRight = true; static class MyGeneralListener implements MKGeneralListener {
@Override
public void onGetNetworkState(int iError) {
Log.d("MyGeneralListener", "onGetNetworkState error is " + iError);
Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(),
"Network error", Toast.LENGTH_LONG).show();
} @Override
public void onGetPermissionState(int iError) {
Log.d("MyGeneralListener", "onGetPermissionState error is "
+ iError);
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(),
"Permission deny! Add key in BMapApiDemoApp.java!", Toast.LENGTH_LONG).show();
BMapApiDemoApp.mDemoApp.m_bKeyRight = false;
}
}
} @Override
public void onCreate() {
mDemoApp = this;
mBMapMan = new BMapManager(this);
boolean isSuccess = mBMapMan
.init(this.mStrKey, new MyGeneralListener());
if (isSuccess) {
mBMapMan.getLocationManager().setNotifyInternal(, );
startAlarm();
} else {
}
super.onCreate();
} private void startAlarm() {
Log.d(TAG, "start alarm");
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent collectIntent = new Intent(this, GetLocationService.class);
PendingIntent collectSender
= PendingIntent.getService(this, , collectIntent, );
am.cancel(collectSender);
am.setRepeating(AlarmManager.ELAPSED_REALTIME
, SystemClock.elapsedRealtime()
, *
, collectSender);
} @Override
public void onTerminate() {
// TODO Auto-generated method stub
if (mBMapMan != null) {
mBMapMan.destroy();
mBMapMan = null;
}
super.onTerminate();
} }

主要关注如下几点:

BMapApiDemoApp覆盖了Application类,并在onCreate()函数中初始化BMapManager对象,这样程序就可以共享这个对象。 BMapManager类主要有4个函数,init(), start(), stop() 和destory()。一般在Application类的onCreate()函数中调用init,在onDestory()函数中调用destory,这样在需要使用其他API的地方只需要取到这个对象并调用start和stop方法就可以了。但是为了保证BMapManager对象存在,在其他调用的类中还是会做相应的检查。 文件中变量mStrKey保存的是需要去官网申请的API的key,申请很容易。 我在onCreate()函数中还调用了startAlarm()函数。这个函数的作用是每隔10s调用GetLocationService类。 GetLocationService

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

 public class GetLocationService extends Service {

      protected static final String TAG = null;
LocationListener mLocationListener = null;
BMapApiDemoApp app = null;
@Override
public void onCreate() {
super.onCreate();
app = (BMapApiDemoApp) this.getApplication();
if (app.mBMapMan == null) {
app.mBMapMan = new BMapManager(getApplication());
app.mBMapMan.init(app.mStrKey,
new BMapApiDemoApp.MyGeneralListener());
}
app.mBMapMan.start();
final MKSearch mMKSearch = new MKSearch();
mMKSearch.init(app.mBMapMan, new GeoCoderParser()); // 注册定位事件
mLocationListener = new LocationListener() { @Override
public void onLocationChanged(Location location) {
Log.d(TAG, "location change");
if (location != null) {
String strLog = String.format("经度:%f\r\n" + "纬度:%f",
location.getLongitude(),
location.getLatitude());
Log.d(TAG, strLog);
GeoPoint point = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6));
mMKSearch.reverseGeocode(point); app.mBMapMan.getLocationManager().removeUpdates(mLocationListener);
app.mBMapMan.stop();
}
}
};
} @Override
public int onStartCommand(Intent intent, int flag, int startId) {
app.mBMapMan.getLocationManager().requestLocationUpdates(
mLocationListener);
app.mBMapMan.start();
return Service.START_NOT_STICKY;
} @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
} }

其中:

在onCreate()中取到在BMapApiDemoApp里定义的BMapManager对象,并检查是否存在,不存在就初始化一个; 在onStartCommand()中注册LocationListener并调用BMapManager的start函数; LocationListener是在onCreate()中定义的,mMKSearch.reverseGeocode()传入GeoPoint对象,搜索之后的返回值通过GeoCoderParser类取到;当得到Location信息之后我调用了removeUpdates和stop函数停止请求更新。

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

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

GeoCoderParser

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

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

arg1是错误码,搜索失败的时候通过错误码得到失败原因; arg0是传入的地址信息,它是一个MKAddrInfo对象,对象有个字段是addressComponents,这个字段保存了从省、市一直到门牌号的信息。

  public class GeoCoderParser implements MKSearchListener {

      private static final String TAG = "GeoCoderParser";

      @Override
public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
if (arg1 != ) {
String str = String.format("%d", arg1);
Log.d(TAG, str);
return;
}
MKGeocoderAddressComponent address = arg0.addressComponents;
Log.d(TAG, "Location info:" + address.province + address.city + address.district);
} //other functions }

总结

程序的流程大致就是这样,我也是初学,如果哪里写错了欢迎批评指正。

最后给出项目代码的链接:http://files.cnblogs.com/wangfenjin/BaiduMapService.zip 。我没找到博客园哪里可以传附件,所以是通过“文件”那个标签上传的,不知道你们可不可以下载。

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

Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息的更多相关文章

  1. Android端百度地图API使用详解

    百度地图API简介 百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松的访问百度服务和数据,构建功能丰富.交互性强的地图应用程序. 百度地图移动版A ...

  2. 【转载】Android端百度地图API使用详解

    转载地址:http://www.cnblogs.com/rocomp/p/4994110.html 百度地图API简介 百度地图移动版API(Android)是一套基于Android设备的应用程序接口 ...

  3. android 基于百度地图api开发定位以及获取详细地址

    一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key. 二:新建项目baidumaplocation.设计main.xml文件这里注意的是MapView ...

  4. Android 调用百度地图API

    一.到 百度地图开发平台下载SDK http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download 1.点击自定义下载 2.下 ...

  5. Android使用百度地图API实现GPS步行轨迹

    百度地图Android SDK下载:http://developer.baidu.com/map/sdkandev-download.htm 下面是效果: 采样点取得太频繁所以看起来像是一个个点... ...

  6. 【Android接百度地图API】百度地图Demo点击按钮闪退

    运行百度地图自带的BaiduMap_AndroidSDK_v4.1.0_Sample里面的BaiduMapsApiASDemo发现点击上面的按钮会闪退,控制台报的是xml的问题 查了一下,官方文档特别 ...

  7. android笔记---百度地图api应用 (二) 获取公交路线的详细信息

    package com.example.bdtest; import com.baidu.mapapi.MKEvent; import com.baidu.mapapi.MKPlanNode; imp ...

  8. android笔记---百度地图api应用 (一)

    package com.example.bdtest; import com.baidu.mapapi.MKEvent; import com.baidu.mapapi.MKPlanNode; imp ...

  9. android调用百度地图API

    http://blog.csdn.net/lyq8479/article/details/6384428

随机推荐

  1. uni-app强大的前端框架,h5,原生app(两大系统),微信小程序

    最近发现一款强大的前端框架,它叫uni-app 这是一款通用的框架可以打包app,h5,微信小程序, 说说要弄这个工具需要会那些技能吧, 要熟悉vue,微信小程序.这样这个框架用的就是很快上手了 模块 ...

  2. webpack学习(六)—webpack+react+es6(第2篇)

    接上篇        webpack学习(五)—webpack+react+es6(第1篇) 本文做个简单的图片加文字的页面.其中,配置文件跟上篇一致.项目结构: index.html <!DO ...

  3. springMVC返回汉字字符串乱码,以及返回的字符串乱码的问题

    1.springMVC在使用@ResponseBody注解返回字符串为什么出现乱码呢?(这里以spring4.3.1为例) 原因分析:原因在返回字符串时StringHttpMessageConvert ...

  4. 慕课网页面app的滑动

    #coding=utf-8from appium import webdriver def get_driver(): desc={ "platformName":"An ...

  5. [luogu4026 SHOI2008]循环的债务 (DP)

    传送门 吐槽洛谷难度标签qwq Solution 显然是一道神奇的DP,由于总钱数不变,我们只需要枚举前两个人的钱数就可知第三个人的钱数 DP的时候先枚举只用前k个币种,然后枚举前两个人的钱数,然后枚 ...

  6. 基于Homestead搭建PHP项目开发环境(适合Zend Framework,Laravel,Yii,thinkphp等)

    参考: https://framework.zend.com/bl...参考: https://laravel.com/docs/5.5/... 第一步:软件的下载和安装 软件1:VirtualBox ...

  7. MySQL经常使用命令--show命令使用

    log into the mysql for localhost mysql -u username -ppasswd(there is no space) for ip mysql -h ip -P ...

  8. SQL Server 运行计划操作符具体解释(2)——串联(Concatenation )

    本文接上文:SQL Server 运行计划操作符具体解释(1)--断言(Assert) 前言: 依据计划.本文開始讲述另外一个操作符串联(Concatenation).读者能够依据这个词(中英文均可) ...

  9. 【cl】工程导入

    File>Open 导入成功

  10. 《深入浅出 Java Concurrency》——原子操作

    part1 从AtomicInteger開始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包.而Queue.非常多情况下使用到了Atomic操作.因此首 ...