Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)

最近遇到一个比较棘手的问题:使用GPS定位无法获取当前的地理位置,即getLastKnownLocation方法始终返回null。

后来一篇博文 getLastKnownLocation()返回null的解决 帮了我大忙,在此对该博客作者表示感谢,但是有几点需要注意的,我觉得有必要补充一下,否则看了这篇博文也还是得不到当前的地理位置。

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

第二:LocationListener 最好在Activity的onCreate()方法中进行实例化

实现系统的回调方法:

onLocationChanged(final Location loc)

onProviderDisabled(final String s)

onProviderEnabled(final String s)

onStatusChanged(final String s, final int i, final Bundle b)

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

第四:测试GPS是否定位成功,去一个空旷的地方去,不要有遮挡。这点非常重要,不然,你永远也不知道自己GPS定位是否成功。

以下是我用GPS成功获取当前地理位置的例子。希望能够帮助大家摆脱GPS定位的阴霾。

@Override

public void onCreate(final Bundle icicle) {

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 = new BuoyItemizedOverlay(mDefaultMarker, this);

initDensityDpi();

mZoomLevel = mapView.getMaxZoomLevel() - 1;

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

mLocationListener = new LocationListener() {

@Override

public void onLocationChanged(final Location loc) {

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

if (loc != null) {

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

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

GeoPoint geoPoint = MapUtils.getGeoPoint(loc);

mapController.animateTo(geoPoint);

initBuoyOverlayItems(loc);

} else {

Toast( MapViewActivity.this, "Your current location is temporarily unavailable.",

Toast.LENGTH_SHORT).show();

}

}

// 当系统Setting -> Location & Security -> Use wireless networks取消勾选,Use GPS                   satellites取消勾选时调用

public void onProviderDisabled(final String s) {

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

}

// 当系统Setting -> Location & Security -> Use wireless networks勾选,Use GPS satellites勾           选时调用

public void onProviderEnabled(final String s) {

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

}

public void onStatusChanged(final String s, final int i, final Bundle b) {

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

}

};

}

@Override

public void onStart() {

super.onStart();

mapController.setZoom(mZoomLevel);

if (!DoSomeGoodUtils.isNetworkAvailable(this)) {

mBtnDone.setEnabled(false);

showDialog(DIALOG_NO_NETWORK);

} else {

// 判断Use GPS satellites.是否勾选

boolean isGpsEnabled = MapUtils.isGPSProviderAvaliable(this);

// 判断Use wireless networks 是否勾选

boolean isWIFIEnabled = MapUtils.isWIFIProviderAvaliable(this);

if (!isGpsEnabled && !isWIFIEnabled) {

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

}

else {

Location lastKnownLocation = null;

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

if (isGpsEnabled && !isWIFIEnabled) {                     lastKnownLocation=mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

mProviderName = LocationManager.GPS_PROVIDER;

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

} else if(!isGpsEnabled && isWIFIEnabled){

lastKnownLocation =    mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

mProviderName = LocationManager.NETWORK_PROVIDER;

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

} else if (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);

// 获取当前地理位置

GeoPoint lastKnownPoint = getLastKnownPoint(lastKnownLocation);

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

mapController.animateTo(lastKnownPoint);

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

initBuoyOverlayItems(lastKnownLocation);

}

}

}

}

@Override

protected void onResume() {

super.onResume();

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

if (!TextUtils.isEmpty(mProviderName)) {

// 当GPS定位时,在这里注册requestLocationUpdates监听就非常重要而且必要。

没有这句话,定位不能成功。

mLocationManager.requestLocationUpdates(mProviderName, 1000, 1,

mLocationListener);

}

}

@Override

protected void onPause() {

super.onPause();

// 取消注册监听

if (mLocationManager != null) {

mLocationManager.removeUpdates(mLocationListener);

}

}

}

对于定位方式:有些同行,更倾向于使用getBestProvider方法,但是我认为这种方式有他的弊端,不是所有的手机都支持  “使用getBestProvider获取最适合的Location” ,最好就是使用网络定位和GPS定位....

注: MapUtils是我自己写的一个工具类

源代码地址:http://url.cn/PU7vxq

时间: 2024-12-25 13:04:47

Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)的相关文章

Android的GPS获取方法

Android的GPS获取方法 其实这是一个伪命题:因为我不是要说android的gps获取实现,或者说底层具体实现:而是我直接使用了百度地图的sdk,在其中直接获取到gps信息,以前有做过这个功能,今天就直接将demo介绍一下以利大家. 第一步:获取sdk 在百度地图的开发者官网上直接就可以下载到线程的demo:当然功能相对是齐全的,基本解决需要地图的各种功能了.http://developer.baidu.com/map/index.php?title=androidsdk 第二步,获取ke

安卓模拟器Android SDK Manager 无法获取SDK列表的解决办法

1.打开运行Android SDK Manager ,Tool菜单,选择Options,打开设置菜单,勾选“Force https://...sources to be fetched using http://...”,,然后点Close关闭,如下图: 2.设置hostes文件能电脑能正常访问Google下载中心 打开C:\Windows\System32\drivers\etc文件夹,双击hosts文件,选择使用记事本打开,把以下代码加到hosts文件中. 74.125.113.121 de

Android GPS获取当前经纬度坐标

APP中可能会遇到一种需求,就是将当前所在位置的坐标传到服务器上,今天我提供三种途径去获取经纬度坐标信息,第一种是通过Android API来实现,第二种通过百度地图API来实现,第三种通过天地图API来实现. 第一种方法(Android API实现),废话不多说,上代码. MainActivity代码如下: public class MainActivity extends Activity { private static final String TAG = MainActivity.cl

android通过gps获取到当前位置

定位有GPS定位和基站定位:GPS定位是基于卫星进行定位,要求头顶要空旷,定位误差在2-10米,基站网络定位是根据距离手机的距离进行定位,误差较大,只要手机有信号即可定位:获取gps信息分为以下几步: 1)获取与位置相关的服务  服务都是通过上下文获取出来的 manager =(LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 2)选择一种目前状态下最好的定位方式 gps定位或者基站定位 /** * * @p

Android 6.0以上获取Wifi列表问题

在已经打开 Wifi 的情况下获取 Wifi 时,wifiManager.getScanResults() 方法始终返回的是null.因为当时是在网上查询资料敲的代码,多找了几份资料后,看到代码都是一样的,反复确认自己有没有遗漏或者写错.甚至怀疑人生!索性克服心理恐惧点开源码,结果却找到了答案: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /** * Return the results of the latest access point scan. *

移动端报表如何获取当前地理位置

1. 描述 对于企业大多数员工来说,由于其工作位置的固定的,可以有多种方式进行上班打卡签到以保证该员工有按时正常来上班,但是对于经常需要出差,去客户现场的员工来说,就无法保证他们是否有去工作,所以希望能通过手机位置定位来保证员工有正常上班.以报表开发工具FineReport 移动端为例演示企业可以如何完美解决这一问题. 2. 解决思路 可以通过FineReport模板添加一个按钮控件,点击该按钮的时候,获取当前地理位置,并将该位置信息复制给某个单元格,最后员工填报当前模板即可. 3. 示例 实现

[转] Android SDK manager 无法获取更新版本列表

打开这个网址(LINK)就可以看到adt的详细信息. 或者直接在你的eclipse的Help > Install New Software里面add,地址直接输入 https://dl-ssl.google.com/android/eclipse/ https://dl-ssl.google.com/android/eclipse/ 到Android SDK官网下载ADT离线升级包 http://developer.android.com/sdk/installing/installing-ad

Xamarin.Android 使用百度地图获取定位信息

最近做一个项目,web端使用百度地图,PDA使用手持机自带的GPS定位系统获取经纬度,然后再百度地图上显示该经纬度会有一定距离的差异,这里就像可乐的瓶子拧上雪碧的盖子,能拧的上却不美观.所以为了数据的精确性,PDA端也用百度地图的接口. 下面主要流程分为以下几步: 新建项目BaiduMapAPIDemo. 下载百度地图 --Android定位SDK . Binging Labrary项目添加相关文件. 注册百度开发平台,创建应用,获取AK. 写入百度提供示例代码. 查看输出结果. 第一步:新建项

android SDK manager 无法获取更新版本列表【转载】

http://mirrors.neusoft.edu.cn/eclipse/releases/luna/打开这个网址就可以看到adt的详细信息:  http://developer.android.com/sdk/installing/installing-adt.html 或者直接在你的eclipse的Help > Install New Software里面add,地址直接输入 https://dl-ssl.google.com/android/eclipse/https://dl-ssl.