本文主要介绍了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这个类。代码如下:

 1 public class BMapApiDemoApp extends Application {2 3     private static final String TAG = "BMapApiDemoApp";4 5     static BMapApiDemoApp mDemoApp;6 7     BMapManager mBMapMan = null;8 9     String mStrKey = "Your key here!!";
10     boolean m_bKeyRight = true;
11
12     static class MyGeneralListener implements MKGeneralListener {
13         @Override
14         public void onGetNetworkState(int iError) {
15             Log.d("MyGeneralListener", "onGetNetworkState error is " + iError);
16             Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(),
17                     "Network error", Toast.LENGTH_LONG).show();
18         }
19
20         @Override
21         public void onGetPermissionState(int iError) {
22             Log.d("MyGeneralListener", "onGetPermissionState error is "
23                     + iError);
24             if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
25                 Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(),
26                         "Permission deny! Add key in BMapApiDemoApp.java!", Toast.LENGTH_LONG).show();
27                 BMapApiDemoApp.mDemoApp.m_bKeyRight = false;
28             }
29         }
30     }
31
32     @Override
33     public void onCreate() {
34         mDemoApp = this;
35         mBMapMan = new BMapManager(this);
36         boolean isSuccess = mBMapMan
37                 .init(this.mStrKey, new MyGeneralListener());
38         if (isSuccess) {
39             mBMapMan.getLocationManager().setNotifyInternal(10, 5);
40             startAlarm();
41         } else {
42         }
43         super.onCreate();
44     }
45
46     private void startAlarm() {
47         Log.d(TAG, "start alarm");
48         AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
49         Intent collectIntent = new Intent(this, GetLocationService.class);
50         PendingIntent collectSender
51             = PendingIntent.getService(this, 0, collectIntent, 0);
52         am.cancel(collectSender);
53         am.setRepeating(AlarmManager.ELAPSED_REALTIME
54             , SystemClock.elapsedRealtime()
55             , 10 * 1000
56             , collectSender);
57     }
58
59     @Override
60     public void onTerminate() {
61         // TODO Auto-generated method stub
62         if (mBMapMan != null) {
63             mBMapMan.destroy();
64             mBMapMan = null;
65         }
66         super.onTerminate();
67     }
68
69 }

主要关注如下几点:

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(),代码如下:

1 public class GetLocationService extends Service {2 3     protected static final String TAG = null;4     LocationListener mLocationListener = null;5     BMapApiDemoApp app = null;6     @Override7     public void onCreate() {8         super.onCreate();9         app = (BMapApiDemoApp) this.getApplication();
10         if (app.mBMapMan == null) {
11             app.mBMapMan = new BMapManager(getApplication());
12             app.mBMapMan.init(app.mStrKey,
13                     new BMapApiDemoApp.MyGeneralListener());
14         }
15         app.mBMapMan.start();
16         final MKSearch mMKSearch = new MKSearch();
17         mMKSearch.init(app.mBMapMan, new GeoCoderParser());
18
19         // 注册定位事件
20         mLocationListener = new LocationListener() {
21
22             @Override
23             public void onLocationChanged(Location location) {
24                 Log.d(TAG, "location change");
25                 if (location != null) {
26                     String strLog = String.format("经度:%f\r\n" + "纬度:%f",
27                             location.getLongitude(),
28                             location.getLatitude());
29                     Log.d(TAG, strLog);
30                     GeoPoint point = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6));
31                     mMKSearch.reverseGeocode(point);
32
33                     app.mBMapMan.getLocationManager().removeUpdates(mLocationListener);
34                     app.mBMapMan.stop();
35                 }
36             }
37         };
38     }
39
40     @Override
41     public int onStartCommand(Intent intent, int flag, int startId) {
42         app.mBMapMan.getLocationManager().requestLocationUpdates(
43                 mLocationListener);
44         app.mBMapMan.start();
45         return Service.START_NOT_STICKY;
46     }
47
48     @Override
49     public IBinder onBind(Intent intent) {
50         // TODO Auto-generated method stub
51         return null;
52     }
53
54 }

其中:

在onCreate()中取到在BMapApiDemoApp里定义的BMapManager对象,并检查是否存在,不存在就初始化一个; 在onStartCommand()中注册LocationListener并调用BMapManager的start函数; 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)函数。这个函数有两个参数:

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

 1 public class GeoCoderParser implements MKSearchListener {2 3     private static final String TAG = "GeoCoderParser";4 5     @Override6     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 functions
17
18 }

总结

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

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

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

转载于:https://www.cnblogs.com/zhujiabin/p/7592995.html

Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息相关推荐

  1. android 调用百度地图规划,Android 调用百度地图API

    一.到 百度地图开发平台下载SDK 1.点击自定义下载 2.下载自己想要的功能包我这里选了三个 3.获取密钥 获取密钥之前我们要新建一个应用 填写好相关的信息 二. 新建一个项目工程 1. 把下载好的 ...

  2. Android利用百度地图API实现定位功能(记录)

    本篇主要介绍一下如何使用百度地图API来实现定位以及地图的基本使用. 效果图如下: 步骤如下: 一.申请APIKey. (1)注册百度账号并申请开发者资质:http://developer.baidu ...

  3. Android如何实现地图定位?Android studio+百度地图API+Android6.0系统实现地图显示、地址设置、点击地图定位功能(详细)

    文章说明:本文初衷是为了记录毕设学习过程,避免忘记操作流程.该功能是毕业设计的Android软件端的功能之一,本文将从获取百度地图密钥(AK)开始,详细地对地图定位配置和相关代码进行说明,文末将附上实 ...

  4. 百度地图android自定义文字,Android SDK | 百度地图API SDK

    什么是百度地图Android SDK? 百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口, 您可以通过该接口实现丰富的LBS功能: 地图:提供地图(2D.3 ...

  5. 利用百度地图API进行车辆查询并用鼠标拾点获取经纬度

    利用百度地图API查询公交车线路位置信息以及鼠标取点的经纬度 先从官网申请秘钥http://lbsyun.baidu.com/ 2. 如果是用jsp写动态web项目,在jsp页面中引入js库,并且引入 ...

  6. 在vue中使用百度地图API:区域显示3D棱柱、地点标注、信息提示

    文章目录 1.在vue中引入百度地图的script 2.生成想要的地图样式 3.生成地图 4.创建3d棱柱 5.设置标记点和提示框 6.代码总结 1.在vue中引入百度地图的script 在publi ...

  7. Android使用百度地图api获取定位信息(经纬度)

    文章目录 注册 申请密钥 配置 使用 遇到问题 注册 登录百度地图开放平台 注册百度地图开发者,填写相关信息 提交成功后收到邮件 点击链接弹出如下提示就算激活成功了 申请密钥 点击申请密钥或者创建应用 ...

  8. android poi搜索提示搜索对象已销毁,Android SDK | 百度地图API SDK

    使用须知 在使用百度地图SDK(Android版)之前,请仔细阅读使用条款,一旦您使用了百度地图SDK(Android版),即表明您已阅读并接受使用条款中的全部内容.百度地图SDK(Android版) ...

  9. Android Studio+百度地图API实现简单gis移动端App

    实习说明: 由于很多内容网上都是详细说明,但是我在帮助同学们解决问题过程遇到许多奇怪的问题,花了很多时间去解决,网上查不到,所以值得我记录下来,让后面的学弟学妹节省大部分时间!!同时我也会将该文章发布 ...

最新文章

  1. java编译的语句_在Java语言中,下列语句能通过编译的是()。
  2. 汇报的时候注意的事项
  3. php中嵌套调用的原理,嵌套调用
  4. 两个网口芯片接一个变压器_一看就会:详细讲解网络变压器作用
  5. VS清理中间文件bat脚本
  6. PowerDesigner 将 CDM 转为 Oracle SQL建表语句
  7. 字节跳动java面试题,附详细答案解析
  8. 麻雀虽小,五脏俱全!RT-Thread BK7252 麻雀一号开发板上手体验
  9. c语言程序框图示范,C语言程序框图courseware.ppt
  10. 关于浏览器flash插件遇到的一些坑
  11. LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域
  12. MyBatis框架笔记
  13. MATLAB算法实战应用案例精讲-【人工智能】语义分割(补充篇)(附matlab代码实现)
  14. winfrom 水晶报表制作
  15. PDF编辑工具怎么为PDF文件添加页码
  16. DataBricks从开源到商业化踩过的坑
  17. Office Web Apps 非专业测评
  18. python和按键精灵自动化测试_高级版按键精灵,同时也是UI自动化测试的好帮手 - SIKULI...
  19. ElementUI如何校验表格单元格内容?其实很简单
  20. 食品批发销售必用的仓库进销存系统?

热门文章

  1. 长波通信、中波通信、短波通信、超短波通信与微波通信介绍
  2. 如何设置MathType下标的正斜体
  3. 编程珠玑十一章课后题答案
  4. 李航《统计学习方法》习题答案
  5. python time.time()计算代码运行时间
  6. Pytorch-基于Transformer的情感分类
  7. 各种pytorch项目
  8. Beta冲刺随笔集合
  9. Kafka Eagle 源码解读
  10. App-IOS与Android弱网环境测试