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

使用LocationManager获取GPS地理位置信息

 
阅读更多

这两天可憋坏我了,一直愁没什么题材可以充实我的博客,正巧最近遇到一个比较棘手的问题:使用GPS定位无法获取当前的地理位置,即getLastKnownLocation方法始终返回null。
后来一篇博文getLastKnownLocation()返回null的解决帮了我大忙,在此对该博客作者表示感谢,但是有几点需要注意的,我觉得有必要补充一下,否则看了这篇博文也还是得不到当前的地理位置。

第一:当使用GPS定位时,最好不要使用getLastKnownLocation方法获得当前位置对象Location,因为该对象可以在onLocationChanged的参数中由系统给予(根据文档,getLastKnownLocation仅仅是获取当缓存中的上一次打开地图缓存起来的位置)。这样就避免了空指针异常。而且更重要的是GPS定位不是一下子就能定位成功的,在90%以上的情况下,getLastKnownLocation返回null

第二:LocationListener最好在Activity的onCreate()方法中进行实例化实现系统的回调方法:onLocationChanged(finalLocationloc)onProviderDisabled(finalStrings)onProviderEnabled(finalStrings)onStatusChanged(finalStrings,finalinti,finalBundleb)

第三:requestLocationUpdates必须要在onResume()中进行注册监听.且在onPause()中进行反注册。

第四:测试GPS是否定位成功,去一个空旷的地方去,不要有遮挡。这点非常重要,不然,你永远也不知道自己GPS定位是否成功。
以下是我用GPS成功获取当前地理位置的例子。希望能够帮助大家摆脱GPS定位的阴霾。
@OverridepublicvoidonCreate(finalBundleicicle){

super.onCreate(icicle);

this.setContentView(R.layout.activity_mapview);
mBtnDone=(Button)findViewById(R.id.btn_done);

mBtnDone.setOnClickListener(this);
mapView=(MapView)findViewById(R.id.map_view);

mapView.setBuiltInZoomControls(true);

mapController=mapView.getController();

mLocationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
mDefaultMarker=getResources().getDrawable(R.drawable.map_redpin);

mDefaultMarker.setBounds(0,0,mDefaultMarker.getIntrinsicWidth(),mDefaultMarker.getIntrinsicHeight());
mBuoyOverlay=newBuoyItemizedOverlay(mDefaultMarker,this);

initDensityDpi();

mZoomLevel=mapView.getMaxZoomLevel()-1;

//LocationListener最好在Activity的onCreate()方法中进行实例化,当GPS获得Location时,会自动调用onLocationChanged方法.
mLocationListener=newLocationListener(){

@Override

publicvoidonLocationChanged(finalLocationloc){

LogHelper.i(TAG,"onLocationChanged.loc:"+loc);

if(loc!=null){

LogHelper.i(TAG,"onLocationChanged.latitude:"

+loc.getLatitude()+",longtitude:".getLongitude());

GeoPointgeoPoint=MapUtils.getGeoPoint(loc);

mapController.animateTo(geoPoint);

initBuoyOverlayItems(loc);

}else{

Toast(MapViewActivity.this,"Yourcurrentlocationistemporarilyunavailable.",Toast.LENGTH_SHORT).show();

}

}
//当系统Setting->Location&Security->Usewirelessnetworks取消勾选,UseGPSsatellites取消勾选时调用

publicvoidonProviderDisabled(finalStrings){

LogHelper.i(TAG,"onProviderDisabled.");

}

//当系统Setting->Location&Security->Usewirelessnetworks勾选,UseGPSsatellites勾选时调用

publicvoidonProviderEnabled(finalStrings){

LogHelper.i(TAG,"onProviderEnabled.");

}
publicvoidonStatusChanged(finalStrings,finalinti,finalBundleb){

LogHelper.i(TAG,"onStatusChanged.");

}

};

}
@OverridepublicvoidonStart(){

super.onStart();
mapController.setZoom(mZoomLevel);

if(!DoSomeGoodUtils.isNetworkAvailable(this)){

mBtnDone.setEnabled(false);

showDialog(DIALOG_NO_NETWORK);

}else{

//判断UseGPSsatellites.是否勾选

booleanisGpsEnabled=MapUtils.isGPSProviderAvaliable(this);

//判断Usewirelessnetworks是否勾选

booleanisWIFIEnabled=MapUtils.isWIFIProviderAvaliable(this);

if(!isGpsEnabled&&!isWIFIEnabled){

如果都没有勾选,则弹出对话框,提示用户勾选。

}else{

LocationlastKnownLocation=null;

//如果只是UseGPSsatellites勾选,即指允许使用GPS定位

if(isGpsEnabled&&!isWIFIEnabled){

lastKnownLocation=mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

mProviderName=LocationManager.GPS_PROVIDER;

//如果只是Usewirelessnetworks勾选,即只允许使用网络定位。

}elseif(!isGpsEnabled&&isWIFIEnabled){

lastKnownLocation=mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

mProviderName=LocationManager.NETWORK_PROVIDER;

//如果二者都勾选,优先使用GPS,因为GPS定位更精确。

}elseif(isGpsEnabled&&isWIFIEnabled){

lastKnownLocation=mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

mProviderName=LocationManager.GPS_PROVIDER;

if(lastKnownLocation==null){

lastKnownLocation=mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

mProviderName=LocationManager.NETWORK_PROVIDER;

}

}

if(!TextUtils.isEmpty(mProviderName)){

mLocationManager.requestLocationUpdates(mProviderName,1000,1,mLocationListener);}

//如果一下子就能定位成功,则执行以下代码,当用网络定位时,大都能一次性定位成功,当用GPS时,该代码不会起太大作用。

if(lastKnownLocation!=null){

mBtnDone.setEnabled(true);

//获取当前地理位置

GeoPointlastKnownPoint=getLastKnownPoint(lastKnownLocation);

//以动画方式移动到该地理位置

mapController.animateTo(lastKnownPoint);

//更新浮标。该方法在这里就不公开了。知道它的含义就行

initBuoyOverlayItems(lastKnownLocation);

}

}

}

}
@Override

protectedvoidonResume(){

super.onResume();

LogHelper.i(TAG,"onResume.ProviderName:"+mProviderName);

if(!TextUtils.isEmpty(mProviderName)){

//当GPS定位时,在这里注册requestLocationUpdates监听就非常重要而且必要。没有这句话,定位不能成功。

mLocationManager.requestLocationUpdates(mProviderName,1000,1,mLocationListener);

}

}

@OverrideprotectedvoidonPause(){

super.onPause();//取消注册监听

if(mLocationManager!=null){

mLocationManager.removeUpdates(mLocationListener);

}

}}

分享到:
评论

相关推荐

    LocationManager获取GPS信息

    总的来说,LocationManager是Android获取GPS和其他位置信息的核心工具。通过合理的配置和使用,开发者可以创建出满足各种定位需求的应用,从导航到位置追踪,再到本地化服务。理解并熟练运用LocationManager,是开发...

    Android LocationManager 获取经纬度和卫星信息

    在Android开发中,LocationManager是系统提供的一种用于获取设备地理位置信息的重要API。它允许开发者访问GPS(全球定位系统)、网络定位服务以及其他可用的位置提供者,从而获取到经纬度坐标和其他位置相关数据。...

    android使用GPS获取当前地理位置

    在本文中,我们将深入探讨如何正确使用Android的GPS功能来获取地理位置,以及避免一些常见问题。 首先,避免使用`getLastKnownLocation`方法来直接获取当前位置。这个方法可能会返回null,因为它既用于获取当前地理...

    android根据GPS获取经纬度和海拔

    总的来说,Android系统提供了丰富的API来获取GPS相关的地理位置信息。开发者可以通过LocationManager或FusedLocationProviderClient来获取经纬度、海拔、速度和时间等数据,为用户提供基于位置的服务。在实际操作中...

    Android GPS 地理位置

    总之,Android中的GPS地理位置功能通过`LocationManager`或`FusedLocationProviderClient`为开发者提供了强大的工具,以实现各种基于位置的应用功能。在开发过程中,我们需要关注权限管理、位置更新策略以及用户隐私...

    android地理位置信息修改

    在Android平台上,获取和修改地理位置信息是常见的功能需求,尤其对于开发者来说,这涉及到GPS(全球定位系统)服务、模拟定位、权限管理等多个方面。本文将深入探讨Android中如何进行地理位置信息的修改。 首先,...

    android 获取Gps信息的程序源码

    在Android平台上,获取GPS(全球定位系统)信息是开发地理位置相关应用的重要环节。这个程序源码将揭示如何从Android设备中获取实时的GPS坐标数据。GPS功能被广泛应用于地图导航、运动追踪、位置服务等领域。以下是...

    Android代码-获取Gps信息的程序源码.zip

    在Android平台上,获取GPS(全球定位系统)信息是开发地理位置相关应用的重要环节。这份"Android代码-获取Gps信息的程序源码.zip"文件提供了一个示例,帮助开发者理解如何在Android应用程序中实现这一功能。下面我们...

    Android LocationManager获取经度与纬度等地理信息

    在Android开发中,LocationManager是系统提供的一种服务,用于获取设备的地理位置信息,如经度、纬度等。本文将详细介绍如何使用LocationManager来获取这些关键数据。 首先,要使用LocationManager,你需要在...

    获取gps信息

    在Android系统中,获取GPS(全球定位系统)信息是开发者常用的功能之一,它允许应用程序获取用户的实时地理位置,如经纬度、高度以及精确度等信息。本文将深入探讨如何通过编程来实现这一目标,并讨论相关注意事项。...

    Android 获取Gps信息的程序源码

    在Android平台上,获取GPS(全球定位系统)信息是开发者经常需要进行的一项任务,尤其是在开发地图应用、导航系统或者位置服务时。本程序源码提供了一个简单的实例,展示了如何在Android中实现这一功能。通过分析这...

    获取Gps信息的程序源码

    总的来说,"获取Gps信息的程序源码"涉及到的知识点包括Android Location API的使用、权限管理、处理GPS数据、优化定位体验、电源管理以及与其他服务(如地图API)的集成。通过学习和理解这些知识点,开发者可以构建...

    GPSDemo,主要是获取GPS信息部分

    在Android系统中,获取GPS信息主要通过`LocationManager`服务和`LocationListener`接口。首先,应用需要在`AndroidManifest.xml`中申请访问位置的权限。然后,注册`LocationListener`,监听GPS位置的变化。 3. **...

    android 地理位置信息获取demo

    在Android平台上,获取地理位置信息是移动应用开发中的关键功能,尤其对于导航、地图服务或位置相关的社交应用来说。本教程将深入探讨如何在Android中实现地理位置信息的获取,以"android 地理位置信息获取demo"为例...

    android获取GPS经纬度,并根据经纬度获取准确地址 _andoid 原生开发定位无法获取经纬度,

    在Android原生开发中,获取GPS经纬度以及根据这些经纬度获取准确的地理位置信息是常见的需求。以下将详细讲解如何实现这一功能。 首先,我们需要理解GPS(全球定位系统)的基本概念。GPS是一种基于卫星导航的定位...

    android模拟器使用gps定位

    以下是如何使用`LocationManager`获取GPS定位数据: ```java // 获取LocationManager实例 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 检查GPS是否已...

    android手机应用源码获取Gps信息的程序源码.rar

    在Android平台上,获取GPS(全球定位系统)信息是开发地理位置相关应用的重要环节。这份"android手机应用源码获取Gps信息的程序源码"提供了一个实际的示例,帮助开发者理解如何在Android应用中实现这一功能。下面...

    更踪设备的地理位置(LocationManager)

    `LocationManager`是Android框架中的一个关键组件,它允许开发者获取设备的地理位置信息。要使用`LocationManager`,首先需要在AndroidManifest.xml文件中添加相应的权限: ```xml ``` `ACCESS_FINE_LOCATION`...

    Android 获取Gps信息的程序源码.rar

    在Android平台上,获取GPS(全球定位系统)信息是开发地理位置相关应用的重要环节。这份"Android 获取Gps信息的程序源码.rar"压缩包文件提供了一个示例程序,它可以帮助开发者理解如何在Android应用中实现这一功能。...

Global site tag (gtag.js) - Google Analytics