尝试使用网络提供商获取纬度和纬度

时间:2014-05-09 21:20:26

标签: android gps locationmanager android-location

我正在尝试使用网络提供商而非gps提供商获取当前坐标。

我能够找到解决方案,但我对这个场景中的概念有点困惑。

工作代码

这是我获取坐标的代码:

public void getLocation(){

        locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
        if(appUtils.isOnline()){

            try{

                Geocoder geocoder = new Geocoder(
                        MainActivity.this.getApplicationContext(),
                        Locale.getDefault());
                Location locationNetwork = locationManager
                        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

                List<Address> list;

                if(locationNetwork!=null){

                    Toast.makeText(context,"Network Available!!",Toast.LENGTH_LONG).show();
                    list = geocoder.getFromLocation(locationNetwork.getLatitude(),locationNetwork.getLongitude(),3);

                    if(list!=null&&list.size()>0){

                        latitude = list.get(0).getLatitude();
                        longitude = list.get(0).getLongitude();

                        Toast.makeText(context,String.valueOf(latitude) + " (....) " + String.valueOf(longitude),Toast.LENGTH_LONG).show();

                        int count = 0;
                        while (latitude==null||longitude==null){

                            latitude = list.get(count).getLatitude();
                            longitude = list.get(count).getLongitude();
                            count++;
                            Toast.makeText(context,String.valueOf(latitude) + " --- " + String.valueOf(longitude),Toast.LENGTH_LONG).show();
                        }
                    }
                }else{

                    Toast.makeText(context,"No response!!",Toast.LENGTH_LONG).show();

                }
            }catch (IOException e){

                e.printStackTrace();
            }

        }else{

            Toast.makeText(context,"Server not responding",Toast.LENGTH_LONG).show();

        }

    }

启用gps后,这段代码工作正常。如果gps被禁用,则无效。

现在,如果我们将位置设置为 NETWORK_PROVIDER

Location locationNetwork = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

为什么我们仍然需要gps?

现在,如果我将其更改为 PASSIVE PROVIDER

Location locationNetwork = locationManager
                                .getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);

它适用于被动提供商。为什么会这样?

有人可以解释一下这里的主要区别是什么以及与网络提供商建立坐标的正确方法是什么?

我知道这个问题已被问过几次,我确实经历过。我只想清除这个概念。

提前感谢.. :))

2 个答案:

答案 0 :(得分:2)

它不需要GPS来使用网络提供商,我已经做了很多次。但是,如果getLastKnowLocation从未对该提供程序进行过应用程序请求更新,或者上次发生的时间太长,则getLastKnowLocation可能不会返回值。您不能指望该函数始终返回非NULL。如果您想确保获得位置,请改用requestSingleUpdate。这将始终为您提供一个位置(假设您使用的提供程序已启用),但可能需要一些时间 - 结果可能无法立即获得。

(还有一个时间功能可能永远不会返回 - 如果您使用GPS提供商,它无法锁定足够的卫星来寻找位置。例如,如果您在地下停车场)。

答案 1 :(得分:1)

通过检查所有可用的网络选项,这是我用来快速获取当前位置的一些代码。

private double[] getGPS(){
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
    List<String> providers = lm.getProviders(true);

    /* Loop over the array backwards, and if you get an accurate location, then break out the loop*/
    Location l = null;

    for (int i=providers.size()-1; i>=0; i--) {
            l = lm.getLastKnownLocation(providers.get(i));
            if (l != null) break;
    }

    double[] gps = new double[2];
    if (l != null) {
            gps[0] = l.getLatitude();
            gps[1] = l.getLongitude();
    }
    return gps;
}