位置服务管理器(LocationManager)
首先,我们需要1个LocationManager,考虑到它会被多个方法使用,我们将它定义成Activity的Field。然后在onCreate方法中为它赋值。
//变量定义
private LocationManager locationManager;
//得到LocationManager
locationManager = (LocationManager) this
.getSystemService(Context.LOCATION_SERVICE);
开启位置服务的监听
有了LocationManager之后,我们就可以开始监听位置的变化了。我们使用LocationManager中的方法:
requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
来设置监听器。
首先,我们要注意到第1个参数,这个参数的值为2选1,分别是:LocationManager.NETWORK_PROVIDER和LocationManager.GPS_PROVIDER,前者用于移动网络中获取位置,精度较低但速度很快,后者使用GPS进行定位,精度很高但一般需要10-60秒时间才能开始第1次定位,如果是在室内则基本上无法定位。
这2种Provider本质上是互补的,在本教程中,我们会同时开启2个监听,但基于移动网络的监听只会执行一次就会被停止,而基于GPS的监听则会一直持续下去,直至用户自己停止监听。
代码片段如下:
首先,我们会声明1个监听器的内部类,这个类会同时用于2种模式的监听。还要声明1个变量,用于记录当前的位置。
private class MyLocationListner implements LocationListener{
@Override
public void onLocationChanged(Location location) {
// Called when a new location is found by the location provider.
Log.v("GPSTEST", "Got New Location of provider:"+location.getProvider());
if(currentLocation!=null){
if(isBetterLocation(location, currentLocation)){
Log.v("GPSTEST", "It's a better location");
currentLocation=location;
showLocation(location);
}
else{
Log.v("GPSTEST", "Not very good!");
}
}
else{
Log.v("GPSTEST", "It's first location");
currentLocation=location;
showLocation(location);
}
//移除基于LocationManager.NETWORK_PROVIDER的监听器
if(LocationManager.NETWORK_PROVIDER.equals(location.getProvider())){
locationManager.removeUpdates(this);
}
}
//后3个方法此处不做处理
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
}
};
Location currentLocation;
private void showLocation(Location location){
//纬度
Log.v("GPSTEST","Latitude:"+location.getLatitude());
//经度
Log.v("GPSTEST","Longitude:+location.getLongitude());
//精确度
Log.v("GPSTEST","Accuracy:"+location.getAccuracy());
//Location还有其它属性,请自行探索
}
以下是开始监听
private LocationListener gpsListener=null;
private LocationListener networkListner=null;
private void registerLocationListener(){
networkListner=new MyLocationListner();
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, networkListner);
gpsListener=new MyLocationListner();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, gpsListener);
}
以上的代码还是很易懂的吧,创建1个监听器对象,然后指定1个provider,然后requestLocationUpdates。在监听器中检查如果是NETWORK_PROVIDER,则取消监听,只留GPS的监听(在你的实际应用中可以根据情况来进行,因为GPS有可能会因为建筑的阻挡而暂时不工作)。
位置精度的判断
在showLocation方法中,我们打印了location的Accuracy属性,这就是精确度,一般来说NETWORK得到的位置精度一般在500-1000米,GPS得到的精度一般在5-50米,基于这个属性我们可以对精度进行判断,以决定是否采用这个精度。
你可能已经注意到上面的代码中有1个isBetterLocation方法,这是用来判断获取的位置是否更好,事实上这个方法来自于Dev Guide。我们看下这个方法的内容:
private static final int CHECK_INTERVAL = 1000 * 30;
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 > CHECK_INTERVAL;
boolean isSignificantlyOlder = timeDelta < -CHECK_INTERVAL;
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);
}
从代码中可以很清楚的看出判断位置是否“更好”的准则,不仅使用了精度(getAccuracy()),还使用了时间进行判断。事实上除了在导航应用,其它的时候均可以直接使用上面的这个方法来对位置更新信息进行过滤,以减少不断更新界面而带来的性能损失。
结束监听
只需要调用LocationManager对象的removeUpdates(LocationListener listener)方法就可以停止监听。事实上,在之前的代码中你已经看到我们移除了基于移动网络的监听器,下面的代码片段用于移除GPS监听器。
if(gpsListener!=null){
locationManager.removeUpdates(gpsListener);
gpsListener=null;
}
LocationManager的其它使用
这里还要介绍LocationManager中的几个方法:
getLastKnownLocation(String provider),用于得到上次定位时的最后位置,通常在应用刚启动时立刻得到1个位置,这样应用看上去会比较快。
getBestProvider(Criteria criteria, boolean enabledOnly),根据条件(精度的高低,是否能够得到海拔等)以及当前是否开启,得到1个最好的位置Provider。看上去很美,但现在的Android系统中只有2个Provider,而大多数用户的GPS都是开启的,在仅仅是2选1的情况我想像不出这个方法的用途。而即便用户关闭了GPS,我们也有能力帮他开启,用完了之后再关掉它。开启的方法见《进阶:如何编程实现开启或关闭GPS?》。
总结
2个Provider提供了不同精度的定位服务,我们可以根据情况来使用。
一般来说,先使用NETWORK来得到1个精度较差的位置,再使用GPS来得到更准确的位置。
在Android官方提供的Dev Guide中,提供了一个关于GPS使用的时间线,我们来看一下
分享到:
相关推荐
使用GPS和WIFI定位功能需要在AndroidManifest.xml中声明相应的权限: - `<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />`: 允许访问精细(GPS)位置信息。 - `<uses-permission ...
在Android中,通过`LocationManager`服务和`LocationProvider`接口,开发者可以请求并解析来自GPS卫星的数据,从而获取精确的经纬度、海拔和速度信息。要使用GPS,你需要在AndroidManifest.xml文件中添加必要的权限...
本资源“androidgps基站与WIFI定位源码.zip”提供了一套实现GPS、基站和Wi-Fi定位功能的源代码,非常适合Android开发者学习和参考。 首先,我们要理解Android系统中的定位机制。Android提供了Location API,这是一...
在Android平台上,定位服务是应用程序开发中的重要组成部分,它允许用户获取设备的地理位置信息,用于导航、社交、健康管理等各种用途。本源码包专注于三种主要的定位技术:GPS(全球定位系统)、WiFi和基站定位。 ...
Android WiFi LBS(Location-Based Services,基于位置的服务)定位是通过结合WiFi网络信号和移动通信基站信息来确定设备的位置。这种定位方式在GPS信号不可用或者信号弱的室内环境尤为实用。下面将详细介绍Android ...
这份“androidGPS及WIFI基站定位坐标源码.zip”压缩包包含了一些实现这两种定位方式的源代码,对于学习Android定位机制非常有帮助。接下来,我们将深入探讨这两种定位方法及其在源码中的实现细节。 1. GPS定位: ...
在Android平台上,定位服务是应用程序开发中的重要组成部分,它允许用户获取设备的地理位置信息。本文将详细介绍基于Android的三种定位方式:GPS(全球定位系统)、WiFi网络定位和基站定位,并结合提供的源码资源...
在Android平台上,Google提供了一套全面的定位服务,使得开发者能够轻松实现基于GPS、Wi-Fi基站和移动网络的综合定位功能。这篇文档将详细介绍如何在Android应用中利用这些技术进行定位。 首先,我们需要理解...
2. WIFI定位:WIFI定位利用已知的WIFI热点数据库,通过比较设备当前接收到的WIFI信号,匹配数据库中记录的信号特征来确定位置。在Android中,使用`WifiManager`类和`LocationManager`服务结合,通过`addWifiListener...
这份"Android应用源码之androidGPS及WIFI基站定位坐标源码"提供了实现这两种定位方式的详细示例,帮助开发者更好地理解和运用到自己的项目中。 一、Android GPS定位 Android系统通过Google Play服务提供的Location ...
在Android系统中,定位服务是应用开发者不可或缺的功能之一,它主要依赖于三种技术:基站定位、Wi-Fi定位和GPS(全球定位系统)定位。这三种技术各有特点,互相补充,共同构建了Android设备的综合定位能力。 **基站...
在Android开发中,GPS(全球定位系统)和基站定位是两种常见的定位技术,它们用于获取设备的地理位置信息。本文将详细讲解这两种定位方式,并结合Android Studio的开发实践,阐述如何在实际应用中实现它们。 首先,...
- **集成**:在Android应用中,可以创建一个`LocationManager`实例,通过`requestLocationUpdates()`方法订阅定位更新,选择合适的定位提供者(如`LocationManager.GPS_PROVIDER`或`LocationManager.NETWORK_...
总的来说,基于位置指纹的Android平台WiFi定位系统通过结合先进的算法和优化的系统设计,实现了在复杂环境下的高效、精准定位。这一技术不仅提升了室内定位服务的质量,也为未来智能城市、物联网等领域的应用奠定了...
本资源包含的"androidGPS及WIFI基站定位坐标源码"提供了实现这些功能的具体代码实现,对于开发者来说是很好的学习和参考材料。 GPS定位是通过接收来自多个GPS卫星的信号来计算设备的位置。Android系统提供了...
在 Android 中,获取 GPS 状态可以通过 Settings.System 来实现: String gpsState = Settings.System.getString(getContentResolver(), Settings.System.LOCATION_PROVIDERS_ALLOWED); 这将返回一个字符串,表示...
人们在室外广泛使用目前较成熟的GPS,A-GPS等定位系统进行定位,但是在复杂的室内环境中,这些技术的定位精度不高,不能满足室内定位的需求。WIFI网络具有通信快速、部署方便的特点,它在室内场所广受欢迎.Android...
【标题】中的“安卓Android源码——androidGPS及WIFI基站定位坐标源码”表明了这是一个关于Android系统中GPS和Wi-Fi基站定位功能的源代码集合。在Android平台上,定位服务是应用程序能够获取用户当前位置的关键组件...
这份"Android应用源码之androidGPS及WIFI基站定位坐标源码.zip"压缩包包含了实现这两种定位方式的源代码示例,非常适合初学者深入理解和实践Android定位系统的工作原理。 首先,我们要了解GPS定位。GPS定位是通过...
总结来说,“GPS及WIFI基站定位坐标源码”是关于如何在Android环境中实现高效且节能的位置定位服务的实例。它结合了GPS和WiFi基站两种定位方式,以满足不同场景下的定位需求,并可能涉及与网络通信的部分,将位置...