http://developer.android.com/guide/topics/location/strategies.html
基于android的定位无非就两种:network、gps。两者各有优劣。
Network:定位快,准确度低,受环境影响小。
GPS:定位慢,准确度高,受环境影响大。
本文要解决的问题:
1. locationManager.getLastKnownLocation方法返回null。
2. 如何实现快速而又精确的定位。
E文好的话,直接看官网就好了http://developer.android.com/guide/topics/location/strategies.html
在你的程序里如果有这样的代码你就要注意了(现在看来这些倒是多余了)
[java] view plaincopy
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度
criteria.setAltitudeRequired(false);//无海拔要求
criteria.setBearingRequired(false);//无方位要求
criteria.setCostAllowed(true);//允许产生资费
criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗
// 获取最佳服务对象
String provider = locationManager.getBestProvider(criteria,true);
locationManager.getLastKnownLocation(provider);
locationManager.getBestProvider(criteria,true);方法看起来很完美,但其实返回值就network、gps二选一。而且如果你要求高精度,它会优先检查GPS,如果手机开启了GPS就返回GPS,否则返回network。如果都没开启则返回null。
结合Network、GPS两种定位方式的优劣不难看出为什么getLastKnownLocation方法会返回null(这只针对第一次定位)。
当你开启GPS,provider的值为GPS。这时的定位方式为GPS,由于GPS定位慢(我测试的时间大约为50秒),所以它不可能立即返回你一个Location对象,所以就返回null了。还有人用下面的方法解决这个问题:
[java] view plaincopy
while (location ==null) {
location = locationManager.getLastKnownLocation(provider);
}
这绝对是个愚蠢的做法!举个例子:如果你在室内,gps无法定位到,你的程序将陷入死循环。当然使用requestLocationUpdates可以做到定位且不让程序陷入死循环,但是定位耗时长,甚至得不到定位。
如果使用网络定位呢,不得说这也是一个不错的选择。locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0,networkListener);
网络定位耗时一般在2秒左右(网络差,时间会更长),只要你接入网络,基本上都能获得定位。唯一的缺点就是精度不高。
那能不能将两者结合,这也是本文的重点。既然结合两者,就要同时为两者添加监听
[java] view plaincopy
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000 * 2,50,gpsListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,networkListener);
这样,大概2秒我们就可以得到来自网络的定位,一分钟后得到来自GPS定位。这时用GPS定位替换网络定位就好了。当然这只是个理想的情况,现实要复杂的多。
比如:
你第一次定位成功返回location,由于网络问题第二次返回null。这时会发现,更新的location没有上次的精确,甚至是null,无法使用,这时我们要判断当前的location和新获得的location那个更好。可能你获得GPS定位后,由于天气、进入隧道等原因GPS服务器丢失,无法更新location(这时一个好的做法是切换到network定位)。还有可能用户没有开启GPS和network,根本就谈不上定位(其实每次定位成功都会有个定位缓存的,可以使用getLastKnownLocation获得)。
终上所述,我们要做的就是:
1. 尝试通过getLastKnownLocation获取上次定位信息
2. 开启network和gps监听
3. 获得network定位信息location
4. 比较当前location和新获取的location哪个更好(来自network)
5. 获得gps定位信息location
6. 停掉network监听
7. 比较当前location和新获取的location哪个更好(来自gps)
8. 如果gps服务器丢失,重新开启network监听
以GPS监听为例
[java] view plaincopy
// GPS监听的回调函数
private class GPSLocationListener implements LocationListener {
private boolean isRemove = false;//判断网络监听是否移除
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generatedmethod stub
boolean flag =betterLocation.isBetterLocation(location,
currentBestLocation);
if (flag) {
currentBestLocation = location;
updateLocation(currentBestLocation);
}
// 获得GPS服务后,移除network监听
if (location !=null && !isRemove) {
locationManager.removeUpdates(networkListener);
isRemove = true;
}
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generatedmethod stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generatedmethod stub
}
@Override
public void onStatusChanged(String provider, int status, Bundleextras) {
// TODO Auto-generatedmethod stub
if (LocationProvider.OUT_OF_SERVICE == status) {
Toast.makeText(MainActivity.this,"GPS服务丢失,切换至网络定位",
Toast.LENGTH_SHORT).show();
locationManager
.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0,
networkListener);
}
}
}
其中isBetterLocation是用来判断哪个location更好的。这个方法来自android官网的,通过location获取的时间,精度等信息进行判断。
因为之前上传的demo,大家觉得意义不大,所以就不再提供了。
下图的‘微秒’单位错了,应该是毫秒
相关推荐
《ArcGIS for Android 定位实现详解》 ArcGIS for Android 是Esri公司推出的一款强大的地理信息系统(GIS)开发框架,专为Android平台设计。它提供了丰富的地图展示、空间分析和地理位置服务等功能,使得开发者能够...
Android GPS 定位的实现 Android GPS 定位是 Android 平台中的一种常见的定位服务,通过使用 Google 地图实现 GPS 定位服务。下面是 Android GPS 定位的实现知识点: 一、添加权限 要使用 Android 平台的 GPS ...
在本篇内容中,我们将深入探讨如何在Android中进行简单的定位实现。 首先,我们需要了解Android中的定位服务主要依赖于两种技术:GPS(全球定位系统)和网络定位。GPS定位通过接收卫星信号来确定精确的位置,而网络...
总的来说,实现Android定位服务需要理解Android的定位机制,引入并配置百度定位SDK,设置监听器接收定位更新,以及正确处理定位结果和异常情况。这只是一个基础的实现,实际应用中可能需要根据业务需求进行更复杂的...
Android 定位功能实现 Android 系统提供了强大的定位功能,通过调用 GPS 数据,返回经纬度信息。实现定位功能需要使用 android.location 包,包中包含了多个类,用于描述当前设备的地理位置信息。 首先,Location...
Android调用OpenCV2.4.10实现二维码区域定位 Android调用OpenCV 2.4.10实现二维码区域定位是Android开发者中的一种常见需求。通过调用OpenCV 2.4.10,可以实现二维码区域的定位和识别。OpenCV是一个开源的计算机...
本文将深入探讨如何使用Android定位服务,以及如何结合百度地图API实现精准的定位功能。由于Google Maps在中国的限制,我们通常会转向使用百度地图API来获取位置信息。 首先,Android定位服务主要基于两种技术:GPS...
Android 实现锚点定位 Android tabLayout+recyclerView实现锚点定位 仔细看的话,这种滑动定位的功能,还可以整体滑动,再加上顶部tablayout 吸附悬停的效果。 实现效果: 布局 这里采用的是两个 tablayout。 一...
基于Android平台定位系统设计和实现 Android 平台是基于 Linux 平台的开源移动操作系统,由 Google 于 2007 年 11 月 05 日宣布。Android 采用软件堆层架构,把整个 Android 架构分为三部分:应用软件、中间层和...
本篇文章将详细讲解如何使用ArcGIS for Android实现地图的定位以及放大缩小功能。 首先,我们需要理解ArcGIS for Android的基本架构。ArcGIS的核心组件包括Map、MapView和LocationDisplay。Map是地图内容的容器,...
以下是关于Android定位权限申请的详细知识: 1. **运行时权限**: - 在Android 6.0及以上版本,用户可以在应用运行时决定是否授予某些敏感权限,如访问位置、联系人、相机等,而不是在安装时全部授权。 - 这种...
本项目“Android-Android定位基于百度基础定位sdk封装”提供了一个方便开发者使用的Android定位解决方案,它基于百度地图SDK进行封装,简化了集成过程,使得开发者能够更快速地实现定位功能。 首先,我们需要了解...
在Android平台上,实现百度定位功能是一项常见的需求,尤其对于开发地图相关的应用来说至关重要。本教程将详细介绍如何使用百度定位SDK来获取用户当前的地理位置信息。首先,我们需要了解百度定位服务的基础概念。 ...
Android开发项目时常常会遇到定位这个功能,本案例主要是AndroidStudio实现高德定位。 博客地址:http://blog.csdn.net/dickyqie/article/details/56840100
1. Google Play服务:Android Studio利用Google Play服务提供的Location API来实现定位功能。首先,确保在项目build.gradle文件中添加了Google Play服务库的依赖: ```groovy dependencies { implementation '...
综上所述,这个压缩包提供的源码涵盖了Android平台中基于GPS和WIFI基站的定位机制,对开发者来说是一个宝贵的参考资料,有助于深入理解Android定位系统的实现原理,并提升在实际项目中的应用能力。
在Android平台上,开发一款应用以实现GPS定位并获取经纬度值是常见的需求。这个"Android应用实现GPS定位返回经纬度Demo"就是一个实例,它演示了如何有效地从Android系统的Location服务中获取地理位置信息。下面我们...
基于Android系统的移动定位模块设计与实现 本文主要介绍基于Android系统的移动定位模块设计与实现,涵盖了移动定位模块的概念、设计原理、Android平台下的实现方法等方面的内容。 一、移动定位模块概述 移动定位...
1. **Wi-Fi室内定位技术研究与实现**:在Android平台上设计并实现了Wi-Fi定位系统,构建了基于Wi-Fi的定位服务器。 2. **行人航迹推算PDR技术研究与实现**:基于Android手机平台,开发了PDR技术,优化了步长估计算法...
在Android平台上,实现简单的定位功能是一项常见的任务,它涉及到Android系统的地理位置服务,主要依赖于GPS(全球定位系统)以及网络定位技术。本实例将详细解析如何在Android应用中集成定位功能,让应用能够获取到...