Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息
本文主要介绍了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在后台定时获取地理位置信息的更多相关文章
- Android端百度地图API使用详解
百度地图API简介 百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松的访问百度服务和数据,构建功能丰富.交互性强的地图应用程序. 百度地图移动版A ...
- 【转载】Android端百度地图API使用详解
转载地址:http://www.cnblogs.com/rocomp/p/4994110.html 百度地图API简介 百度地图移动版API(Android)是一套基于Android设备的应用程序接口 ...
- android 基于百度地图api开发定位以及获取详细地址
一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key. 二:新建项目baidumaplocation.设计main.xml文件这里注意的是MapView ...
- Android 调用百度地图API
一.到 百度地图开发平台下载SDK http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download 1.点击自定义下载 2.下 ...
- Android使用百度地图API实现GPS步行轨迹
百度地图Android SDK下载:http://developer.baidu.com/map/sdkandev-download.htm 下面是效果: 采样点取得太频繁所以看起来像是一个个点... ...
- 【Android接百度地图API】百度地图Demo点击按钮闪退
运行百度地图自带的BaiduMap_AndroidSDK_v4.1.0_Sample里面的BaiduMapsApiASDemo发现点击上面的按钮会闪退,控制台报的是xml的问题 查了一下,官方文档特别 ...
- android笔记---百度地图api应用 (二) 获取公交路线的详细信息
package com.example.bdtest; import com.baidu.mapapi.MKEvent; import com.baidu.mapapi.MKPlanNode; imp ...
- android笔记---百度地图api应用 (一)
package com.example.bdtest; import com.baidu.mapapi.MKEvent; import com.baidu.mapapi.MKPlanNode; imp ...
- android调用百度地图API
http://blog.csdn.net/lyq8479/article/details/6384428
随机推荐
- Nginx.conf介绍
在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户user www-data; #启动进程,通常设置成和cpu的数量相等worker_process ...
- PAT_A1152#Google Recruitment
Source: PAT A1152 Google Recruitment (20 分) Description: In July 2004, Google posted on a giant bill ...
- Coloring Flame Graphs: Code Hues
转自:http://www.brendangregg.com/blog/2017-07-30/coloring-flamegraphs-code-type.html I recently improv ...
- SDOI2017数字表格
求$\prod_{i=1}^n\prod_{j=1}^n\text{Fib}[\gcd(i,j)]\;\text{mod}\;10^9+7$的值 令$n\leq m$,则有: \begin{align ...
- 【3】Django创建第一个项目
天地所以能长且久者,以其不自生,故能长生. --老子<道德经> 写在前面:Django在学习的过程中,我们会参考官方文档,从两部分进行讲解,第一部分主要是一个入门项目的搭建开发,第二部分是 ...
- 图论·Floyd算法·HDU2544&1874 (伪)2066
在看到1874的题时,第一反应是用上一篇的并查集方法,后来查了一下是要用Floyd做,所以就去查Floyd算法的资料. 即插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法. 核心代码: ma ...
- Web Service 附件技术的发展及演变
Web Service 通常将业务数据封装在 SOAP 主体或者 SOAP 消息附件中进行传输,这些附件往往采用 Base64 编码二进制方式进行封装,这将大大增加待传输的数据量,消耗比较长的编码时间 ...
- C#的WaitHandle : 管理多线程状态
有时候,我们创建了多线程,需要知道是否都完成了各自的工作.比如说,开启了多线程的下载,如何终止所有的线程并且在确保所有线程都终止之后才继续执行程序的退出呢? public partial class ...
- Java 学习(8):java 方法
Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 命名规则: 1. 必须以 字母.'_'或'$'开头. ...
- eclipse jvm调优
1.初始参数 -Xms256m-Xmx1024m 2.在eclipse.ini中加入,注意一点的是D:/soft/eclipse-jee,这个目录必须存在,启动时并不会自动目录 -verbose:gc ...