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

(转)获取用户位置信息的研究心得

 
阅读更多

知道用户的位置信息可以使你的程序更加的智能并且能够提供更好的信息给你的用户,当开发一个位置感知的程序的时候,你可以使用gps或者是android的网络位置提供者来获取用户的位置。虽然使用GPS最精确,但是他仅能工作在户外,并且他更耗电量,还不能及时的返回用户的位置信息。相比较而言,android的网络位置提供者通过基站或者是WI-FI信号来判断用户的位置,它既能工作在户外,也能工作在室内,反应迅速,耗电较少。你可以同时使用这两种方式来获得位置信息,也可以使用这两种方式中的一种。

通过用户的移动设备获取位置信息是很复杂的,有这么几个原因导致获取位置时发生错误。

原因如下:

      1. 有多种方式获取位置,可以通过GPS,Cell-ID, Wi-Fi等等,这三种方式都能让你获取位置信息,判断使用哪种方式获得的信息会牵扯到精度,响应速度和电量耗费等等问题。
      2. 用户不断的移动,那么你必须不断的去估算用户的位置信息
      3. 不断变化的精度 从一个位置源获取的位置信息并不是一成不变的,10秒钟前你在A位置源获取的位置信息可能比你从A 处或者是B处获取的最新的位置信息要精确。

    1. 请求位置更新

    在定位上述的一些问题之前,让我们先来看看如何在android上获取位置信息。

    在Android上通过回调的方式来获取用户位置信息,通过LocationManagerrequestLocationUpdates(),方法,你就可以注册当前的Activity给LocationManager,那么这个LocationManager就能够周期性的通知这个已经注册了的activity最新的位置信息,这个activity必须提供监听器以让LocationManager对调,提供的监听器必须要实现LocationListener的如下几个方法,当用户的位置或者是网络位置服务的状态发生改变时,这几个方法就会被LocationManager回调。

    // Acquire a reference to the system Location Manager

    LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    // Define a listener that responds to location updates

    LocationListener locationListener = new LocationListener() {

    public void onLocationChanged(Location location) {

    // Called when a new location is found by the network location provider.

    makeUseOfNewLocation(location);

    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}

    };

    // Register the listener with the Location Manager to receive location updates

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

    引申:让我们来看看上述代码用到的相关的api

    LocationManager: 这个类让你能够使用系统的位置服务,这些服务能够让android程序周期性的获得设备的物理位置的更新,或者是 当用户接近一个特别的物理位置的时候,应用程序能够发送一个特殊的意图提醒用户。你不能实例化这个类获得该类的实例对象,而是通过Context.getSystemService(Context.LOCATION_SERVICE)来获取句柄

    public void requestLocationUpdates (Stringprovider, long minTime, float minDistance,LocationListenerlistener)

    注册当前的activity能够被指定的provider周期性的通知。如果当前的位置或者是指定provider的状态发生变化的时候,当前activity提供的LocationListener会被周期性的调用。获取最新的位置信息需要消耗一些时间,应用程序可以通过getLastKnownLocation(String)方法得到一个最接近的位置(这个地方还有待斟酌)。

    如果当前provider服务被用户关闭的话,注册更新就会停止,provider的状态就会变为disable,onProviderDisabled(String)方法就会被调用。一旦当前provider又被打开,那么onProviderEnabled就会被调用,注册更新又会重新开始。

    通过第二个和第三个参数能够控制位置更新的频率。第一个参数minTime代表两次位置更新之间的时间间隔,如果minTime大于0,那么LocationManager就会在一次更新完后,休息minTime时间,然后继续更新,这样能够节省电量。第三个参数minDistance是一个位置更新的条件,因为用户的位置可能是不断变化的,当前后两次位置的距离大于minDistance的时候,才会更新。如果想尽快得到获取更新,那么把这两个参数都设为0吧。

    当保持GPS或者是无线网络服务一直运行的时候,后台的服务应当设置充分的时间间隔以至于设备不会消耗太多的电量,小于60000毫秒的时间间隔是不被推荐的。

    调用位置服务的线程必须是含有looper的线程。

    Locationandroid.location.LocationManager.getLastKnownLocation(Stringprovider)

    从指定provider上获取最后一个位置修正的信息,即时不开启这个provider也能使用这个方法,但是这个时候这个provider的状态为disable,该函数的返回值为null,注意这个返回值location有可能国企,例如关闭移动设备或者是移动到其他的位置。

    问题:

    1. 系统是如何缓存位置修正信息的?

    getLastKnownLocation方法获取的是最后一个缓存的位置信息,当调用requestLocationUpdates方法的时候,位置服务就会开始不断的缓存更新的位置修正信息,当调用了removeUpdates方法停止更新的时候,缓存就会停止,这个时候调用getLastKnownLocation方法,获取的就是最后一个缓存的位置修正信息。由于缓存的位置信息有可能过期,所以你需要判断返回值是否为null,并作特殊处理。

    2. 在手机上如何开启位置服务呢?

    以我的G3为例,打开“设置”-----》“位置“,就会看到如下界面

    image

    第一个对应NETWORK_PROVIDER

    第二个对应GPS_PROVIDER

    如果这里不打开服务的话,你的程序是无法获取位置信息的。

2. 位置服务的权限设置

为了使用NETWORK_PROVIDER or GPS_PROVIDER来获取位置信息,你必须要在程序中配置用户的权限,获取用户的位置信息需要权限ACCESS_COARSE_LOCATION 或者ACCESS_FINE_LOCATION

<manifest ... >

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

...

</manifest>

注意:如果你使用NETWORK_PROVIDER 和GPS_PROVIDER 两种方式的话,你只需要声明ACCESS_FINE_LOCATION这个权限就可以了,它包括了这两种provider所需要的权限。ACCESS_COARSE_LOCATION权限仅仅声明了NETWORK_PROVIDER所需要的权限

3. 定义一个获取用户配置信息的最好的模型

一个基本的获取获取位置信息的程序是简单的,但是如果要考虑到位置信息的精度,用户的移动,获取位置的方法,对于手机电量的需求,获取位置是很复杂的。

你必须建立一个模型来指导你的程序如何去获得用户位置,这个模型演示了什么时候监听和移除监听位置更新,什么时候缓存位置信息数据

获取用户位置信息的步骤

  1. 开启程序
  2. 开始监听位置的更新
  3. 确定一个最好的当前的位置信息
  4. 停止监听
  5. 使用最好的位置信息

4. 具体实现步骤

4.1 确定什么时间开始监听更新

你可能在程序启动启动起来之后就立即开始监听位置更新,或者是在用户某个动作之后监听。你需要知道的是长时间的监听位置信息的修正很快消耗掉很多电量,但是短时间内又无法获得充分精确地信息

LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;

// Or, use GPS location data:

// LocationProvider locationProvider = LocationManager.GPS_PROVIDER;

locationManager.requestLocationUpdates(locationProvider, 0, 0, locationListener);

4.2 使用上一个已知的位置来得到一个快速的位置修正

LocationListener获取第一个位置修正的时间会很长,为了避免用户等待,在你的LocationListener获取到一个更加精确的位置之前,你应当使用getLastKnownLocation(String)获取一个缓存的位置。

LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;

// Or use LocationManager.GPS_PROVIDER

Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);

4.3 确定什么时候停止监听位置更新

确定什么时候那些新的位置修正不在需要的逻辑是简单还是复杂取决于你的应用程序。位置信息被得到的时间和位置信息被使用的时间之间的间隔越短,位置预估的精度就越高。时刻要注意,长时间的监听位置更新会消耗大量电量。一旦得到你所需要的信息之后,你应当立即调用removeUpdates(PendingIntent)方法停止监听。

// Remove the listener you previously added
locationManager.removeUpdates(locationListener);
注意:这个方法必须调用,如果不调用这个方法,即时你退出了程序,仍然会被更新。

4.4 确定一个最精确的当前位置信息

你可能认为最新的位置修正时最精确的,然而因为位置修正的精度各种各样,最新的位置修正也不一定是最好的。你应当引入一个逻辑来根据一些条件来选择最好的位置修正。这些条件取决于你的程序

下面是一些你可以用来验证位置修正的步骤

验证是否获得的位置是否明显的比上一个要新

验证这个位置的精度比上一个位置的精度高还是低

验证这个位置那个provider提供的并且判断这个provider是否可信

下面就是一个详尽的判断的例子:

private static final int TWO_MINUTES = 1000 * 60 * 2;

/** Determines whether one Location reading is better than the current Location fix * @param location The new Location that you want to evaluate * @param currentBestLocation The current Location fix, to which you want to compare the new one */ protected boolean isBetterLocation(Location location, Location currentBestLocation) { if (currentBestLocation == null) { // A new location is always better than no location return true; }

// Check whether the new location fix is newer or older long timeDelta = location.getTime() - currentBestLocation.getTime(); boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; boolean isNewer = timeDelta > 0;

// If it's been more than two minutes since the current location, use the new location // because the user has likely moved if (isSignificantlyNewer) { return true; // If the new location is more than two minutes older, it must be worse } else if (isSignificantlyOlder) { return false; }

// Check whether the new location fix is more or less accurate int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); boolean isLessAccurate = accuracyDelta > 0; boolean isMoreAccurate = accuracyDelta < 0; boolean isSignificantlyLessAccurate = accuracyDelta > 200;

// Check if the old and new location are from the same provider boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider());

// Determine location quality using a combination of timeliness and accuracy if (isMoreAccurate) { return true; } else if (isNewer && !isLessAccurate) { return true; } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { return true; } return false; }

/** Checks whether two providers are the same */ private boolean isSameProvider(String provider1, String provider2) { if (provider1 == null) { return provider2 == null; } return provider1.equals(provider2); }


转自:http://www.cnblogs.com/transmuse/archive/2010/12/31/1923358.html

分享到:
评论

相关推荐

    大数据课后心得.docx

    麦肯锡全球研究所给出的定义是:一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库团建工具能力范围的数据集合。 2.大数据的价值: 站在社交网络的方面来讲,社交网络为大数据提供了信息汇集、分析的第...

    spring boot框架基于微信小程序的高校学术研讨信息管理系统的实现.rar

    通知与提醒:系统通过微信消息通知功能向用户发送重要通知,包括会议提醒、论文评审结果、会议议程变更等,确保参会者及时获取最新信息。 权限管理与安全性:系统实现了用户权限管理,包括普通参会者、组织者和管理...

    人工智能学习心得.doc

    网络信息检索,也即网络信息搜索,是指互联网 用户在网络终端,通过特定的网络搜索工具或是通过浏览的方式,查找并获取信息的行 为。运用人工智能技术,可以快速准确的在大数据的基础之上获得所需信息。 遗传算法...

    毕业设计之php的校园兼职网站的设计与实现(源码+LW+PPT+演示视频).zip

    经过需求获取和分析,本研究的校园兼职平台的功能性需要划分为了五大模块:实名认证管理模块、兼职信息管理模块、双方互评模块、论坛模块、用户管理模块。 (1)实名认证模块 本模块主要是实现招聘者和兼职的注册和...

    毕业设计-JAVA网络通信系统的研究与开发(论文+源代码+开题报告)

    随着人类进入信息社会步伐的加快,计算机网络及其应用得到了飞速的发展,并且成为人们日常生活中的不可或缺的一部分,成为人们有效获取信息和进行娱乐的主要方式之一。例如,人们可以通过Internet搜索所要的信息,...

    微信小程序项目源码-微信的追星小程序+ssm框架+论文.rar

    粉丝互动模块则为用户提供了与其他粉丝交流的平台,用户可在其中分享心得、参与话题讨论,甚至组织线上线下活动,增强粉丝间的凝聚力。 此外,项目采用SSM框架进行开发,保证了系统的稳定性、扩展性与可维护性。...

    搜索引擎实验报告.docx

    搜索引擎被称为是一个信息处理和获取的黑盒子,通过一定的规则在互联网中爬取信息资源以及对信息进行处理和提取,对外提供接口方便用户查询,从而起到指导用户获取信息的作用,主要由采集信息、组织并处理信息和查询...

    社交数据的征信探索之路 - 腾讯社交网络运营部高级工程师 - 潘宣良

    QQ社交征信团队对此进行了深入地研究与探索,并积累了一些经验和心得。 听众受益: 对基于社交大数据在信用风险领域的应用实践有更多的了解,帮助开拓思路; 对包括社交征信在内的互联网征信及大数据技术应用有...

    毕业设计:基于Springboot的漫画网站

    漫画信息管理方面的任务繁琐,以至于每年都在漫画信息管理这方面投入较多的精力却效果甚微,漫画网站的目标就是为了能够缓解...首先,网上获取信息十分的实时、便捷,只要系统在线状态,无论在哪里都能第一时间查找到

    基于php的游戏门户网站设计

    经过需求获取和分析,本研究的游戏门户网站的功能性需要划分为了五大模块:特色展示模块、博客模块、画廊模块、骑士比武模块和商店模块。 (1)特色展示模块 本模块主要为特色的游戏内容及周边推广展示。每一个子...

    计算机专业毕业设计-微信小程序案例-青少年心理健康科普平台微信小程序-毕设源码+说明文档.rar

    5. **社区交流**:用户可以加入兴趣小组,与其他用户交流学习心得和经验。 **三、技术架构** 该小程序采用前后端分离的技术架构,前端使用微信官方提供的开发工具进行开发,后端采用Node.js + MySQL的架构进行搭建...

    Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影...就通过这篇文章分享一下学习这部分的心得,希望对那些和我一样的初学者有所帮助。  先来说一下,爬虫模拟登陆的基本原理吧,我也是刚开始接触对于一些深层次的东西也不是掌

    毕业设计-springboot基于vue的地方美食分享网站(源代码+论文)

    本项目软件架构选择B/S模式和java技术,总体功能模块运用自顶向下的分层思想。再然后就是实现系统并进行代码编写实现功能。...可以有效快捷的解决想要获取的信息,提高工作效率。地方美食分享网站慢慢的被人们关注

    asp.net知识库

    使用ASP.NET 2.0 Profile存储用户信息[翻译] Level 200 [ASP.NET 2.0]PageParser.GetCompiledPageInstance中存在一个Bug 如何在DotNet 2的登录组件中检索用户的锁定状态及解锁? ASP.NET 2.0, 想说爱你不容易 ...

    丘仕达SEO精华文集

    19.百度分词切词研究 如何获取优质长尾 20.专访丘仕达&ZHN:新传播背后的秘密 21.seo培训:丘仕达SEO群内讲座全记录 22.专访丘仕达:放平心态 兼职做站 23.丘仕达:2008中秋月饼实战 24.丘仕达:我为什么只研究关键字...

    html5 canvas移动浏览器上实现图片压缩上传

    而每次都上传原始大小的图片(后台处理压缩)十分影响用户体验,所以研究了一下通过canvas压缩图片并上传的方法,以下是整理的一些思路和心得: 一、&lt;input type="file"&gt;获取本地图片,并将图片绘制到画布中。...

    企业网站推广方案设计.doc

    企业网站推广方案设计 摘要:网络营销,作为电子商务的第一步,是信息时代企业营销的重要手段,甚至主 要手段。当前,随着网络应用环境的快速成熟,网络营销已引起企业界广泛注意,并已 开始实际应用,作为年轻的...

    关于Android介绍

    在专业性方面,开源Mobile技术团队核心成员,凭借个人人脉关系和有效的运作方式,与来自Google、播思通讯、联想移动、中国移动研究院、澳洲电信、韩国电信的一批技术专家建立了非常稳定的交流、互动机制,他们都将...

    关于Android介绍(2)

    在专业性方面,开源Mobile技术团队核心成员,凭借个人人脉关系和有效的运作方式,与来自Google、播思通讯、联想移动、中国移动研究院、澳洲电信、韩国电信的一批技术专家建立了非常稳定的交流、互动机制,他们都将...

    jQuery权威指南-源代码

    醉心于对JavaScript、jQuery和Ajax等Web开发技术的研究与实践,并长期专注于HTML页面的优化与用户体验的研究,在页面框架搭建、数据流向分析、页面静态优化方面拥有丰富的实践经验。此外,他还是微软技术方面的专家...

Global site tag (gtag.js) - Google Analytics