这两天可憋坏我了,一直愁没什么题材可以充实我的博客,正巧最近遇到一个比较棘手的问题:使用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信息的方法。
Android LocationManager 获取经纬度和卫星信息 配文代码 可帮助熟练使用Android自带的定位api
位置测试 使用 LocationManager API 获取安卓手机位置
一,在很多提供定位服务的应用程序中,不仅需要获取当前的位置信息,还需要监视位置的变化,在位置改变时调用特定的处理方法 ,其中LocationManager提供了一种便捷、高效的位置监视方法requestLocationUpdates(),...
主要介绍了Android LocationManager获取经度与纬度等地理信息的相关资料,希望通过本站大家能掌握这样的知识,需要的朋友可以参考下
最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: 代码如下:getLastKnownLocation(LocationManager.GPS_PROVIDER),于是高兴地不得了。可是一写进...
gps定位,实测可用. 第一个是网络定位,第二个是GPS定位,第三个是直接取缓存。LocationManager本身提供了选择最好的provider的方法: // 获取最好的定位方式 String provider = locationManager....
更踪设备的地理位置以及有关LocationManager的简介和使用。
NULL 博文链接:https://forlan.iteye.com/blog/2264514
这是一个用户定位的示例 Main 类用于演示获取Location Provider Main2 类用于演示获取最佳的Location Provider,两个类要修改Manifest.xml 文件才能分别运行
LocationManager,
使用LocationManager进行GPS定位,或渠道经度、纬度和海拔高度
如何得到的位置,而无需使用GPS 使用LocationManager,获取当前的位置。
android LocationManager 研究资料
LocationManager-master.zip
这是一个利用LocationManager定位的实例demo,可获取经纬度,国家名称,城市名称,街道等信息。详细介绍请移步:http://blog.csdn.net/xiong_it/article/details/46968477
Android LocationManager获取经纬度信息,在不使用第三方地图SDK的情况下,也可以借助Android 本身的定位API来实现相关地理位置功能,相关博文见这里https://blog.csdn.net/diyangxia/article/details/90674393
GPS是Android系统中重要的组成部分,通过它可以衍生出众多的与位置相关的应用。 Android的GPS有一个专门的管理类,称为LocationManager,所有的GPS定位服务都由其对象产生并进行控制。 首先需要明确的是,...
在Android应用程序中,可以使用LocationManager来获取移动设备所在的地理位置信息。看如下实例:新建android应用程序TestLocation。 1、activity_main.xml布局文件 <LinearLayout xmlns:android=...