getLastKnownLocation()返回null的解决

这段时间,定位的头个难题就是GPS定位问题,今天中午终于解决了,在这里面小小分享一下心得,顺便将代码奉上。

getLastKnownLocation仅仅是获取当缓存中的上一次打开地图缓存起来的位置,我总是看着不对劲希望有一个getCurrentLocation之类的函数,可惜木有... ... 所以只好另想起他的办法了~  方法就是用一个循环直到获得location为止~

Java代码  收藏代码
  1. LocationManager mgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
  2. Location location = mgr.getLastKnownLocation(bundle.getString("provider"));  
  3. while(location  == null)  
  4. {  
  5.   mgr.requestLocationUpdates("gps"600001, locationListener);  
  6. }  


完整代码如下:
Java代码  收藏代码
  1. package com.jessie.buzi.impl;  
  2.   
  3. import android.content.Context;  
  4. import android.location.Criteria;  
  5. import android.location.Location;  
  6. import android.location.LocationListener;  
  7. import android.location.LocationManager;  
  8. import android.os.Bundle;  
  9. import android.widget.Toast;  
  10.   
  11. public class UserLocationFound{  
  12.       
  13.     private int latitude = 0;  
  14.     private int longitude = 0;  
  15.     private Context context;  
  16.       
  17.     private LocationManager locationManager;  
  18.     private String provider;  
  19.     private Location location;  
  20.       
  21.     public UserLocationFound(Context context){  
  22.         this.context= context;  
  23.         setLatitudeAndLongitude();    
  24.     }  
  25.       
  26.     public void setLatitude(int latitude) {  
  27.         this.latitude = latitude;  
  28.     }  
  29.   
  30.     public int getLatitude() {  
  31.         return latitude;  
  32.     }  
  33.   
  34.     public void setLongitude(int longitude) {  
  35.         this.longitude = longitude;  
  36.     }  
  37.   
  38.     public int getLongitude() {  
  39.         return longitude;  
  40.     }  
  41.   
  42.     public void setLatitudeAndLongitude() {  
  43.         // TODO Auto-generated method stub  
  44.         // 获取 LocationManager 服务  
  45.         locationManager = (LocationManager) (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);  
  46. //      locationManager.setTestProviderEnabled("gps", true);  
  47.         // 获取 Location Provider  
  48.         getProvider();  
  49.         // 如果未设置位置源,打开 GPS 设置界面。 
  50.         openGPS();  
  51.         // 获取位置  
  52.         location = locationManager.getLastKnownLocation(provider);  
  53.         // 显示位置信息到文字标签  
  54.         updateWithNewLocation(location);  
  55.         // 注册监听器 locationListener ,第 2 、 3 个参数可以控制接收 gps 消息的频度以节省电力。第 2 个参数为毫秒,  
  56.         // 表示调用 listener 的周期,第 3 个参数为米 , 表示位置移动指定距离后就调用 listener。 
  57.           
  58.     }  
  59.       
  60.     // Gps 消息监听器  
  61.     private final LocationListener locationListener = new LocationListener() {  
  62.           
  63.         // 位置发生改变后调用  
  64.         public void onLocationChanged(Location location) {  
  65.             updateWithNewLocation(location);  
  66.         }  
  67.         // provider 被用户关闭后调用  
  68.         public void onProviderDisabled(String provider) {  
  69.             updateWithNewLocation(null);  
  70.         }  
  71.   
  72.         // provider 被用户开启后调用  
  73.         public void onProviderEnabled(String provider) {          
  74.               
  75.         }  
  76.   
  77.         // provider 状态变化时调用  
  78.         public void onStatusChanged(String provider, int status,Bundle extras) {  
  79.         }  
  80.     };  
  81.   
  82.     private void updateWithNewLocation(Location location2) {  
  83.         // TODO Auto-generated method stub  
  84.         while(location == null){  
  85.             locationManager.requestLocationUpdates(provider, 2000, (float0.1, locationListener);  
  86.         }  
  87.         if (location != null) {  
  88.             latitude = ((int)(location.getLatitude()*100000));  
  89.             longitude = (int)(location.getLongitude()*100000);  
  90. //          changeFormat(latitude,longitude);  
  91.         } else {  
  92.             latitude = 3995076;  
  93.             longitude = 11619675;  
  94.         }  
  95.     }  
  96.   
  97.     private void openGPS() {  
  98.         // TODO Auto-generated method stub  
  99.           
  100.         if (locationManage
  101.                 .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)  
  102.                 || locationManager  
  103.                         .isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER)  
  104.         ){  
  105.             Toast.makeText(context, " 位置源已设置! ", Toast.LENGTH_SHORT).show();  
  106.             return;  
  107.         }   
  108.         Toast.makeText(context, " 位置源未设置!", Toast.LENGTH_SHORT).show();  
  109.     }  
  110.   
  111.     private void getProvider() {  
  112.         // TODO Auto-generated method stub  
  113.         // 构建位置查询条件  
  114.         Criteria criteria = new Criteria();  
  115.         // 查询精度:高  
  116.         criteria.setAccuracy(Criteria.ACCURACY_FINE);  
  117.         // 是否查询海拨:否  
  118.         criteria.setAltitudeRequired(false);  
  119.         // 是否查询方位角 : 否  
  120.         criteria.setBearingRequired(false);  
  121.         // 是否允许付费:是  
  122.         criteria.setCostAllowed(true);  
  123.         // 电量要求:低  
  124.         criteria.setPowerRequirement(Criteria.POWER_LOW);  
  125.         // 返回最合适的符合条件的 provider ,第 2 个参数为 true 说明 , 如果只有一个 provider 是有效的 , 则返回当前  
  126.         // provider  
  127.         provider = locationManager.getBestProvider(criteria, true);  
  128.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值