`
huobengluantiao8
  • 浏览: 1029434 次
文章分类
社区版块
存档分类
最新评论

android定时定位 - 利用百度定位API来实现定时定位功能

 
阅读更多

时下LBS 是最热门的话题,前段时间,公司有个 LBS 项目,要求用到地图导航和定位,就研究了下地图和定位。

android 类库中,虽然已经提供了几种定位方式,但是从提供的功能和反应速度上,和其他的第三方定位库相比,还是相形见绌。

搜索了几个第三方定位和地图的API平台,综合考虑了下,选择了百度地图。(第三方地图API的选择,具体还要根据自己的项目要求来选择)

言归正传,现在就说说百度的定位API 吧(该文章,主要是讲定位的,所以就单独说说,百度的定位API 接口)

百度定位API,是 GPS+基站+WIFI+IP混合定位,传感器辅助定位 ,具有 定位方式多,反应时间快等特点(具体的可以搜索一下“百度地图定位API”),下面就讲讲如何实现定时的去定位从而获取实时的定位经纬度。

实现要求:

LBS应用中,缺少不了定位,但是有时,由于网络环境的不稳定等特殊情况,可能会造成定位失败的情况(获取不到定位信息或者访问延时后报错),那就需要有种补救的措施,来实时的获取一个用户当前的定位信息。该示例就是一个实时定位的助手类。

在项目开启时,开启定时定位,每隔一段时间,将经纬度保存在本地,来供应用程序的相关方法调用。

思路:

1. 定时的发送定位请求,首先需要 定时器 Timer 和 TimerTask ,来定时地发送定位请求;

2. 在定位的回调函数里,将定位获取的信息保存到本地

关键代码实现:

1. 首先将百度定位的jar包放入工程中;

2. 定义一个application类,将定位的代码写在里面,放在application中,可以更好的去管理一些全局的变量和操作,由于定时定位是贯穿于整个APP的,所以放在application中比较好。

private LocationClient mLocationClient = null; //定位类

//是否启动了定位API
private boolean isOpenLocation = false;

@Override
public void onCreate() {
mLocationClient = new LocationClient(this); //实例定位类
}

/**
* start定位
*/
private void startLocation()
{
try {
if(!isOpenLocation) //如果没有打开
{

//该部分主要是对定位类的配置,并没有实质性的去获取定位信息
mLocationClient.setCoorType("bd09ll"); //设置返回的坐标类型
mLocationClient.setTimeSpan(myLocationTime); //设置时间
mLocationClient.setAddrType("street_number"); //返回地址类型
mLocationClient.setServiceMode(LocServiceMode.Immediat); //定位方式为:即时定位
mLocationClient.addRecerveListener(new MyReceiveListenner());
mLocationClient.start(); //打开定位
isOpenLocation = true; //标识为已经打开了定位
}
} catch (Exception e) {
Log.i(TAG, "打开定位异常"+e.toString());
}
}



/**
* end 定位
*/
private void closeLocation()
{
try {
mLocationClient.stop(); //结束定位
isOpenLocation = false; //标识为已经结束了定位
} catch (Exception e) {
Log.i(TAG, "结束定位异常"+e.toString());
}
}

/***
* 获取经纬度,
*/
public void getLocationInfo()
{
/**
* 0:正常。

1:SDK还未启动。

2:没有监听函数。

6:请求间隔过短。
*/
int i = mLocationClient.getLocation();
String TAGfont = "getLocationInfo() : ";
switch(i)
{
case 0:
Log.i(TAG, TAGfont+"正常。");
break;
case 1:
Log.i(TAG, TAGfont+"SDK还未启动。");
break;
case 2:
Log.i(TAG, TAGfont+"没有监听函数。 ");
break;
case 6:
Log.i(TAG, TAGfont+"请求间隔过短。 ");
break;
default:
Log.i(TAG, TAGfont+"其他原因");
}
}

//位置发生改变 --- 后台服务模式下有用

private class MyLocationChangedListener implements LocationChangedListener {
@Override
public void onLocationChanged() {
//logMsg("LocationChangedListener: ");
}
}

//接受定位得到的消息 ---- 用于即时扫描服务
private class MyReceiveListenner implements ReceiveListener {
@Override
public void onReceive(String strData) {
logMsg(strData); //调用回调函数
}
}

//*关于即时扫描和后台服务模式,下面会做介绍。

//获取到定位信息后的回调操作

private void logMsg(String str) {
try {
mData = str.trim();

Log.i(TAG, "进入了定位 定时器 更新了经纬度方法 -- 信息:"+ mData);
//解析经纬度
JSONObject jsonObject = new JSONObject(mData) ;
JSONObject jsonjingweidu = jsonObject.getJSONObject("content").getJSONObject("point");
String longitude =jsonjingweidu.getString("y");
String latitude =jsonjingweidu.getString("x");
jingweidu= new double[]{stringToDouble(longitude),stringToDouble(latitude)};
Log.i(TAG, "longitude :"+jingweidu[0] +"latitude : "+jingweidu[1]);


int r = setLocalJingweidu(); //经纬度保存到本地 --------- 文章中省略
if(r==1)
{
double[] temp = getLocalJingweidu(); //从本地获得保存的经纬度信息--------- 文章中省略

Log.i(TAG, "保存经纬度到本地成功 ,经度:"+temp[0]+"纬度:"+temp[1]);
}else
{
Log.i(TAG, "保存经纬度到本地失败");
}
} catch (Exception e) {
Log.i(TAG, "更新操作异常"+e.toString());
}
}


//定时器
private Timer myLocationTimer = null;
//定时线程
private TimerTask myLocationTimerTask = null;

/***
* 初始化定时器
*/
private void initLocationTime()
{
if(myLocationTimer==null)
{
Log.i(TAG, "myLocationTimer 已经被清空了");
myLocationTimer = new Timer();
}else
{
Log.i(TAG, "myLocationTimer 任然存在");
}
}

/***
* 初始化 定时器线程
*/
private void initLocationTimeTask()
{
myLocationTimerTask = new TimerTask() {
/***
* 定时器线程方法
*/
@Override
public void run() {
handler.sendEmptyMessage(1); //发送消息
}
};
}

/***
* 初始化 time 对象 和 timetask 对象
*/
private void initLocationTimeAndTimeTask()
{
initLocationTime();
initLocationTimeTask();
}

/***
* 销毁 time 对象 和 timetask 对象
*/
private void destroyLocationTimeAndTimeTask()
{
myLocationTimer = null;
myLocationTimerTask = null;
}


/***
* 打开定位定时器线程
*/
public void openLocationTask()
{

try {

if(!isOpenLocationTask) ///如果不是打开状态,则打开线程
{
startLocation();//启动定位更新经纬度
//开启定时器
initLocationTimeAndTimeTask(); //初始化定时器和定时线程
myLocationTimer.schedule(myLocationTimerTask, myTime, myTime);
Log.i(TAG, " 打开了定位定时器线程 ");
isOpenLocationTask = true; //标记为打开了定时线程
}else
{
Log.i(TAG, " 已经开启了定位定时器线程 ");
}
} catch (Exception e) {
Log.i(TAG, "打开定位定时器线程 异常"+e.toString());
}
}

/***
* 定时器的回调函数,用来定时的去发送定位请求
*/
private Handler handler = new Handler() {
//更新的操作
@Override
public void handleMessage(Message msg) {
getLocationInfo(); //获取经纬度

Log.i(TAG,"调用了获取经纬度方法");
super.handleMessage(msg);
}
};

//****

设置定位的服务模式。服务模式类型为枚举类型LocServiceMode。目前有两种:一是Background,一是Immediat
Background为后台服务模式,后台每隔设定的时间扫描一次定位依据信息,判定位置是否改变,如果改变,生成定位依据加密串。在此模式下,用户可以调用getLocation来根据当前的定位加密串从服务器获取定位依据。也可以实现并注册一个接口LocationChangedListener,当locationChanged的时候,被调用。
Immediat为即时扫描服务。后台不扫描。当用户想获取当前位置时,需要实现并注册一个接口ReceiveListener,然后调用startLocating函数,会异步的发起wifi扫描。当有结果时,定位SDK会调用接口函数。

(详细的请查看百度地图定位API)

3.好了,application 类中的定位代码完成,接下来要做的就是两件事,一件是,在合适的地方,打开这个定位的定时器来获取定位信息,第二件,就是在关闭APP的时候,去关闭这个定位的定时器。

1> 开启代码:

((locationApplicationBean)getApplication()).openLocationTask(); //开启定时的定位线程

2> 关闭代码:

((locationApplicationBean)getApplication()).closeLocationTask(); //关闭定时的定位线程

4.好了,大功告成了,一个定位定时器就完成了,文章中可能没有说明清楚,示例项目请点击链接下载:http://download.csdn.net/detail/zjl5211314/3712551

如果大家有什么疑问,或者好的建议欢迎交流。


自 http://gaofen100.iteye.com/blog/1249880


分享到:
评论

相关推荐

    android 定时定位 (用的是百度地图定位API)

    该项目是一个定时定位的示例,调用的是百度地图定位API,能够很好的解决定位问题,并且可以进行参数设置来获取到自己需要的定位信息,很不错哦!欢迎下载交流。

    Android例子源码后台定时定位开机自启

    时下LBS 是最热门的话题,前段时间,公司有个 LBS 项目,要求用到地图...,具有 定位方式多,反应时间快等特点(具体的可以搜索一下“百度地图定位API”),下面就讲讲如何实现定时的去定位从而获取实时的定位经纬度。

    后台定时定位开机自启系统.zip

    后台定时定位开机自启系统android 类库中, 虽然已经提供了几种定位方式,但是从提供的功能和反应速度上,和其他的第三方定位库相比,还是相形见绌。搜索了几个第三方定位和地图的API平台,综合考虑了下,选择了百度...

    Android-TimeTask是一个轻量简洁的定时任务队列框架

    TimeTask是一个轻量简洁的定时任务队列框架,专注处理多组任务分发工作 TimeTask内部的实现时基于AlarmManager 广播,在任务与系统api中间做了较好的封装

    Android代码-SweetMusicPlayer

    SweetMusicPlayer是一款基于百度音乐API的在线音乐播放器。拥有播放本地、在线音乐以及mv等功能,采用 MVP RxJava Retrofit 架构的项目, 使用Java和Kotlin混合开发。 更多请看博客。 Features 本地音乐按照歌曲,...

    后台定时定位开机自启系统

    后台定时定位开机自启系统android 类库中, 虽然已经提供了几种定位方式,但是从提供的功能和反应速度上,和其他的第三方定位库相比,还是相形见绌。搜索了几个第三方定位和地图的API平台,综合考虑了下,选择了百度...

    安卓后台定时任务

    安卓后台定时任务

    颜色分类leetcode-android-yoonit-camera:适用于Android的最先进和现代的相机模块,具有许多出色的功能

    android-yoonit-camera提供的所有功能都可以通过CameraView访问,包括相机预览。 下面我们有基本的使用代码,更多详情请看小节。 相机预览 不要忘记请求相机许可。 在您的布局 XML 中像这样使用: < ai.cyberlabs...

    Android 定位系统(GPS)开发详解

    全球定位系统(Global Positioning ...比如应用程序可以借助一个Intent接收器来实现如下功能: 以经纬度和半径规划一个区域,当设备进入给区域,发出提醒信息,还可以和Google Map API一起使用,完成更多的任务。 关

    微信小程序商城项目适配H5、IOS、Android端.zip

    |--platform-api 微信小程序商城api接口 |--platform-common 公共模块 |--platform-framework 打包发布此项目 |--platform-gen 代码生成 |--platform-mp 微信公众号模块 |--platform-schedule 定时任务 |--platform-...

    WiFi开关 Android API

    WiFi开关 Android API 一. 导入udp.jar包到项目中 二. SmartConfig一键配置WiFi开关连接外部路由器 三.生成服务发现时需要发送的数据 四. 解析服务发现时WiFi开关返回给手机的数据 五.生成控制WiFi开关 开或者关...

    android-api-analysis:Android本质录:该库的目的是结合详细的Demo来全面解析Android相关的知识点,帮助读者能够重新进行掌握与理解所产生的要点。不定时更新,与预期接下的要做的事,希望点进来的你能够喜欢:smiling_face_with_heart-eyes::smiling_face_with_heart-eyes:

    android-api-analysis:Android本质录:该库的目的是结合详细的Demo来全面解析Android相关的知识点,帮助读者能够重新进行掌握与理解所产生的要点。不定时更新,与预期接下的要做的事,希望点进来的你能够喜欢:...

    android定时更换SD卡中图片为壁纸

    本例子通过AlarmManager 来周期性的调用一个service,从而达到调用SD卡中图片来更换壁纸的功能,更换壁纸的API是WallpaperManager setBitmap(Bitmap bitmap):将壁纸设置bitmap所代表的位图 setResource(int resid):...

    Android代码-AndroidStudyDemo

    2.1 Android最新版本API学习和使用 2.2 Android中实用和常用的技术(如动画) 2.3 项目基础框架的研究和学习 2.4 Android中最新技术和前沿的跟进 2.5 常用第三方开源库的使用和源码研究 2.6 网络、图片等框架的研究...

    Android代码-TimeTask

    TimeTask内部的实现时基于AlarmManager 广播,在任务与系统api中间做了较好的封装 简单来说满足以下应用场景: 1.当你需要为任务定时启动和结束 2.你有多组任务,时间线上可能存在重叠的情况 目前线上正式环境的...

    毕业设计 - 农业温室大棚-Android

    具体功能是是通过STM32与传感器与控制器联动,进行控制,并将数据传输到树莓派中的数据库存起来,并且对外提供一个WEB服务器和API,可以通过浏览器和客户端进行控制访问和联动 后台服务器/数据库 URL定向 数据库设计...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    6.10 实现可定时响起的闹钟——PendingIntent与AlarmManager的运用 6.11 黑名单来电自动静音——PhoneStateListener与AudioManager 6.12 手机翻背面即静音震动——SensorListener及AudioManager整合应用 6.13 指定...

    android开发入门与实战(下)

    9.2 用广播告诉你——利用Intent来广播(BroadCast)事件 9.2.1 实现Android中的广播事件 9.2.2 BroadCastReceiver介绍 9.3 应用实例详解 9.3.1 程序操作演示 9.3.2 实例编程实现 9.4 本章小结 第10章 一切为用户服务...

    android开发入门教程

    9.2 用广播告诉你——利用Intent来广播(BroadCast)事件 9.2.1 实现Android中的广播事件 9.2.2 BroadCastReceiver介绍 9.3 应用实例详解 9.3.1 程序操作演示 9.3.2 实例编程实现 9.4 本章小结 第10章 一切为用户服务...

    《Google Android开发入门与实战》.pdf

    9.2 用广播告诉你——利用intent来广播(broadcast)事件 180 9.2.1 实现android中的广播事件 180 9.2.2 broadcast receiver介绍 181 9.3 应用实例详解 181 9.3.1 程序操作演示 182 9.3.2 实例编程...

Global site tag (gtag.js) - Google Analytics