`

getLastKnownLocation()返回null的解决

 
阅读更多

http://blog.sina.com.cn/s/blog_74c22b210100sfix.html

http://cjch.iteye.com/blog/1122382

http://blog.csdn.net/l_serein/article/details/6127300

(以下内容转自网络)

这两天可憋坏我了,一直愁没什么题材可以充实我的博客,正巧最近遇到一个比较棘手的问题:
使用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是我自己写的一个工具类

 

分享到:
评论

相关推荐

    Android打开GPS导航并获取位置信息返回null解决方案

    最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: 代码如下:getLastKnownLocation(LocationManager.GPS_PROVIDER),于是高兴地不得了。可是一写进...

    在Android模拟器上模拟GPS功能总是null的解决方法

    首先,尝试通过`LocationManager.getLastKnownLocation("gps")`获取Location对象时,如果返回null,通常是因为模拟器尚未接收到任何GPS数据。一种常见的解决办法是在DDMS(Dalvik Debug Monitor Service)的Emulator...

    Android GPS定位简单 DEMO

    这时的定位方式为GPS,由于GPS定位慢,所以它不可能立即返回你一个Location对象,所以就返回null了。 **3.推荐locationManager.requestLocationUpdates();方法** LocationManager中设定监听位置变化的代码如下: ``...

    phone Message

    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { double latitude = location.getLatitude(); double longitude = location.getLongitude(); ...

    Android_GPS &当前位置更新

    然而,`getLastKnownLocation`可能返回null,尤其是在GPS信号未初始化或不可用时。为了持续获取位置更新,我们需要实现`LocationListener`接口。下面的代码展示了如何创建自定义的`LocationListener`并请求位置更新...

    Android获取地理位置

    如果设备从未获取过位置或者位置提供者不可用,此方法可能会返回null,这就是`gtLastKnownLocation()`可能出现的问题。 为了解决这个问题,我们可以采用异步加载的方式来获取地理位置,即在后台线程中执行定位操作...

    Android之GPS定位详解.pdf

    * onProviderDisabled(String provider):GPS 禁用时触发,返回 null。 可以通过以下代码创建 LocationListener 对象: ```java private LocationListener locationListener = new LocationListener() { public ...

    GPS 定位信息

    然而,如果这是应用程序第一次运行或者GPS没有开启,`getLastKnownLocation()` 很可能返回 `null`,因为没有历史位置信息可供使用。 为了解决这个问题,开发者需要使用 `requestLocationUpdates()` 方法来启动位置...

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

    - 使用`getLastKnownLocation()`可能返回缓存的旧位置,确保在用户允许的情况下实时获取最新位置。 - 考虑使用 fused location provider(融合定位服务),它能更智能地选择最准确的位置源,包括GPS、Wi-Fi和移动...

    Android GPS定位

    - **LastKnownLocation问题**:`getLastKnownLocation`方法仅能获取最近一次的定位数据,如果从未进行过定位,则返回null。这意味着在首次启动应用时,需要触发一次完整的定位过程。 - **定位标志闪烁**:定位过程...

    GPS断网获取经纬度(含广播方式获取)

    需要注意的是,`getLastKnownLocation`可能返回null,表示GPS未启用或者未获取到有效位置信息,因此需要进行判断处理。 三、广播方式获取GPS信息 为了实现更灵活的定位服务,可以注册一个BroadcastReceiver来监听...

    Android地图和定位学习总结.pdf

    如果两者都不可用,`getLastKnownLocation`可能返回`null`。 为了确保应用可以访问定位服务,需要在AndroidManifest.xml中添加相应的权限声明,例如`...

    android的定位功能的实现

    它有多个方法,例如 addGpsStatusListener,addProximityAlert,getAllProviders,getBestProvider,getLastKnownLocation,getProvider 等。 在设计程序时,可以直接指定使用网络方式或 GPS 方式,也可以设定一些...

    Android 打开GPS导航并获取位置信息.doc

    `getLastKnownLocation()`可能返回`null`,尤其是在首次启动应用时。所以,如果你需要实时的位置更新,应该使用`requestLocationUpdates()`方法,并提供一个`LocationListener`: ```java LocationListener ...

    android调用系统功能

    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); double latitude = location.getLatitude(); double longitude = location.getLongitude(); ``` 4. **监听来电** ...

    Android发短信、打电话、查询位置

    private void getLastKnownLocation() { fusedLocationClient.getLastLocation() .addOnSuccessListener(this, location -> { if (location != null) { Log.i("8026", "Last known location: " + location....

    Android判断服务是否运行及定位问题实例分析

    本文将深入探讨如何判断Android服务是否正在运行以及如何解决定位问题。 首先,我们来看如何判断一个服务是否正在运行。在Android中,服务是后台运行的组件,它们可以在用户与应用交互时继续执行任务。以下是一个...

    用Android Location获取当前地理位置的方法

    if (loc == null) { loc = locManger.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); } // 返回Location对象 return loc; } ``` 在上述代码中,`getLastKnownLocation(String provider)`方法用于...

Global site tag (gtag.js) - Google Analytics