试图通过网络提供商获得纬度和纬度

Posted

技术标签:

【中文标题】试图通过网络提供商获得纬度和纬度【英文标题】:Trying to get latitude and latitude with Network provider 【发布时间】:2014-06-27 18:11:35 【问题描述】:

我正在尝试通过网络提供商而不是 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);

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

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

我知道这个问题被问了好几次,我确实经历过。我只是想弄清楚这个概念。

提前谢谢.. :)

【问题讨论】:

【参考方案1】:

使用网络提供商不需要GPS,我做过很多次。但是,如果 getLastKnowLocation 从来没有针对该提供程序的应用程序请求更新,或者如果最后一次发生的时间太久以前,则 getLastKnowLocation 可能不会返回值。您不能指望该函数总是返回非 NULL。如果要确保获得位置,请改用 requestSingleUpdate。这将始终为您提供位置(假设您使用的提供程序已启用),但可能需要一些时间 - 结果可能不会立即可用。

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

【讨论】:

是的.. 你的解释很有意义。是的,getLastKnownLocation 可能不会返回时间间隔的值。但是为什么被动提供者在这种情况下工作,以及获取坐标的方法是否正确,就像我在这篇文章中所做的那样,或者有没有更好的方法来完成它。 PASSIVE 使用 GPS 位置,但不启动 GPS 检测。基本上它只有在另一个应用程序正在使用 GPS 或最近才有效。 感谢您的精彩解释。我认为这很有意义。【参考方案2】:

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

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;

【讨论】:

感谢您提供的代码。它现在可以正常工作,我认为扫描所有可用网络是一个不错的选择。刚刚修改了你的代码,我得到了我的结果。 +1 为您的代码..:) 我希望我能接受这篇文章中的两个答案,但我真的需要解释我的疑惑。再次感谢您的回答.. 真的很有帮助.. :)

以上是关于试图通过网络提供商获得纬度和纬度的主要内容,如果未能解决你的问题,请参考以下文章

如何通过经纬度获取地址信息

任何免费服务或 API 将提供地理坐标(纬度和经度)? [关闭]

如何同时使用 GPS 和网络提供商在 Android 中获取当前位置的纬度和经度值

如何在swift ios中从移动网络获取纬度和经度[关闭]

Android:无法获得准确的经纬度值

可以访问 iPhone GPS 接收器数据(不仅仅是核心位置纬度/经度)