android获取位置location为null的问题

很多人经常遇到这种问题,主要是获取到位置的信息为null,第一个主要要有权限  

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>

第二个我们调用的方法是 Location location = locationManager.getLastKnownLocation(provider);

 这个方法主要是获取上一次的经纬度信息,上一次的话肯定是空的啦。。这是要注册一下获取事件的监听器

等一会以后就可以拿到了经纬度了。。所以说一开始不要着急获取经纬度。。等待一会就有了。。不会报空指针异常。

LocationManager locationManager;
   String serviceName = Context.LOCATION_SERVICE;
   locationManager = (LocationManager) con.getSystemService(serviceName); // 查找到服务信息
   //locationManager.setTestProviderEnabled("gps", true);
  
   locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, mLocationListener01);
   locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, mLocationListener01);

 

 

获取数据和监听器

 

  * 通过location获取当前设备的具体位置
   *
   * @param location
   * @param rowId
   * @param params
   * @param rowId
   */
 private Location updateToNewLocation(Location location) {
  System.out.println("--------zhixing--2--------");
   String latLongString;
   double lat = 0;
   double lng=0;
  
   if (location != null) {
    lat = location.getLatitude();
    lng = location.getLongitude();
    latLongString = "纬度:" + lat + "\n经度:" + lng;
    System.out.println("经度:"+lng+"纬度:"+lat);
   } else {
    latLongString = "无法获取地理信息,请稍后...";
   }
   if(lat!=0){
    System.out.println("--------反馈信息----------"+ String.valueOf(lat));
   }
  
   Toast.makeText(getApplicationContext(), latLongString, Toast.LENGTH_SHORT).show();
 
   return location;
  
 }
  
      // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米
 public final LocationListener mLocationListener01 = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            updateToNewLocation(location);
        }
   

        @Override
        public void onProviderDisabled(String provider) {
         updateToNewLocation(null);
        }

        @Override
        public void onProviderEnabled(String provider) {}

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {}
};
经过测试。。没有问题。。希望帮到你们。。。



在使用LocationManager.getLastKnownLocation("gps")获取gps定位的过程中老是报空指针异常 

在网上百度查了不少资料发现这个问题多出现在2.0以上版本 
解决方法多是: 
1.在AndroidManifest.xml中添加 

Xml代码   收藏代码
  1. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  2. <uses-permission android:name="android.permission.INTERNET" />  
  3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  

2.在emulator control中手动设置经纬度 

但是我的程序这些都写了依旧报空指针 

后来在外国论坛上终于找到一些启发 
一个哥们这样写代码 
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. }  

我试了一下还真有效,他的解释是用debug发现getLastKnownLocation()方法不是一次就能定位的,必须多次才能成功。 

但是显然这样用循环一直等待很没效率,所以我重写了MapActivity的方法 
Java代码   收藏代码
  1.   /** 
  2.     * 这里一定要对LocationManager进行重新设置监听 
  3.     * mgr获取provider的过程不是一次就能成功的 
  4.     * mgr.getLastKnownLocation很可能返回null 
  5.     * 如果只在initProvider()中注册一次监听则基本很难成功 
  6.     */  
  7. @Override  
  8. protected void onResume() {  
  9.     super.onResume();  
  10.     mgr.requestLocationUpdates(bundle.getString("provider"), 600001, locationListener);  
  11. }  
  12.   
  13. @Override  
  14. protected void onPause() {  
  15.     super.onPause();  
  16.     mgr.removeUpdates(locationListener);  
  17. }  

一样也成功了。。  

在外国技术论坛上找了个解释,个人感觉很贴切: 

The call to request update for a location is not blocking, hence it wont wait there. Also the provider in emulator may not have been started. 

A possible check could be to see if the settings in it disable gps provider ? then send geo fix. 

However, I would use Location Listener, it would be ideal in your case since you need a geo fix to proceed further.Location Listener is Used for receiving notifications from the LocationManager when the location has changed. You can unregister the listener after first geofix. 

Note: It can take some time on device to get current location, and even on device this can return null. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值