大家好!最近在做一个android的应用里面用到GPS的内容,过程中遇到问题!
贴个代码: LocationManager locationManager;  
    String serviceName = Context.LOCATION_SERVICE;  
    locationManager = (LocationManager) this.getSystemService(serviceName);  
    // 查找到服务信息  
    Criteria criteria = new Criteria();  
    criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度  
    criteria.setAltitudeRequired(false);  
    criteria.setBearingRequired(false);  
    criteria.setCostAllowed(true);  
    criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗  
    String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息  
    Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置  
    if(location==null){
     location = locationManager.getLastKnownLocation(locationManager.NETWORK_PROVIDER);
    }
    if (location != null) {  
                double  latitude = location.getLatitude();  
                double  longitude= location.getLongitude();
                Address = ConvertUtil.getAddress(longitude, latitude);
    }else{
      Address ="  ";
    }
    // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米  
    locationManager.requestLocationUpdates(provider, 100 * 1000, 500,  new  LocationListener(){
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub

}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub

}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
});
我们Criteria 去获取最佳的Provider,然后去用实现监听位置的改变。
但是在真机上面,我们直接这么去获取的话,获取到的Location会是一个Null,权限注册什么的都没有问题,现在我就非常不解,我们应该怎么去获取一个Location,或者说是获取一个不为NULL的Location,还是我上面这个方法本身就不对?有没有更好的方法,

解决方案 »

  1.   

    在真机上面,我们直接这么去获取的话,会得到系统默认的最优定位方式。有时候不一定就是GPS。如果确定用GPS定位, String provider的设定可以直接=“gps”(LocationManager.GPS_PROVIDER).
      

  2.   

    谢谢!嗯你说的这个我知道,但是直接设定的话获取的Location是null
      

  3.   

    locationManager.getLastKnownLocation(provider):返回上次的地理位置,如果之前手机未定过位,会先返回null的; 另外,通过GPS定位是需要时间的,并且GPS定位如果是在室内的话,效果很不好(基本上是定位不到,要不就差好远).
    相应速度快的话也可采用基站定位(缺点:偏差比gps能大点).
      

  4.   

    我個人開發的幾點心得,請參考1.除了註冊gps權限,請檢查gps定位是否有打開LocationManager status = (LocationManager) (this.getSystemService(Context.LOCATION_SERVICE));
    if (status.isProviderEnabled(LocationManager.GPS_PROVIDER)|| status.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
    // 如果GPS或網路定位開啟
    }2.當你的app啟動的時候,一開始用LocationManager,除了getLastKnownLocation,通常一開始式要佈道位置的,因為一開始的初始定位沒有那麼快,所以真正取得位置都會是在 onLocationChanged() 這個方法裡面。locationManager.requestLocationUpdates(provider, 100 * 1000, 500,  new  LocationListener(){
                    @Override
                    public void onLocationChanged(Location arg0) {
                        // 等到確認有定位資訊或是定位資訊改變會呼叫這個方法
                    }
                    @Override
                    public void onProviderDisabled(String arg0) {
                        // TODO Auto-generated method stub
                        
                    }
                    @Override
                    public void onProviderEnabled(String arg0) {
                        // TODO Auto-generated method stub
                        
                    }
                    @Override
                    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
                        // TODO Auto-generated method stub
                    }
                });
      

  5.   

    这是初学者都会遇到的问题,手机一般是不能不能立刻获得经纬度的,有一定的延时,这个你要在获取的时候处理一下,将location==null给过滤掉就可以了。Location location = locationManager.getLastKnownLocation(provider); 这个代码的意思是获取上次缓存的location的信息,如果你在安装后第一次使用,哪肯定是null。实际上获取位置信息要放在locationManager.requestLocationUpdates方法中