如何在没有互联网连接的情况下获取安卓设备的当前精确位置?

6

我希望在安卓系统中获取当前精确位置坐标。当我的手机连接到WiFi互联网时,我可以获取到位置信息;但是如果我去了没有网络连接的地方,它就无法给出当前位置坐标。相反,它只能提供上一次的位置坐标。

例如:

目前我在A城市,通过wifi连接获取到当前位置坐标;然后我移动到B城市,此时我就无法获取到当前位置坐标,只能得到上一次的位置坐标。

请问有没有人能建议我如何在没有网络连接的情况下获取当前位置坐标。

public Location getLocation() {
    try {
        locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            // First get location from Network Provider
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                if (locationManager != null) {
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }

            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}

/**
 * Stop using GPS listener
 * Calling this function will stop using GPS in your app
 * */
public void stopUsingGPS(){
    if(locationManager != null){
        locationManager.removeUpdates(GetLocations.this);
    }
}

/**
 * Function to get latitude
 * */
public double getLatitude(){
    if(location != null){
        latitude = location.getLatitude();
    }
    return latitude;
}

/**
 * Function to get longitude
 * */
public double getLongitude(){
    if(location != null){
        longitude = location.getLongitude();
    }
    return longitude;
}

1
由于Android使用AGPS,所以你不能这样做。 - Raghav Sood
@Raghav Sood 有没有办法解决我的问题? - user1996510
你的问题实际上是当NETWORK和GPS提供者都被禁用时,如何获取位置?(因为GPS可以在没有网络的情况下工作。)你不能。你可以使用最后已知的位置,但是如果没有启用其中一个提供者,你无法获得新的位置更新。 - Charlie Collins
此外,如果您使用Criteria并循环遍历可用提供程序,并分配满足您标准的第一个提供程序,则代码将更简单。 - Charlie Collins
在https://dev59.com/oHXYa4cB1Zd3GeqP5mFc上的讨论可能会对您解决这个问题有所帮助。 - Hitesh Bhalala
显示剩余2条评论
2个回答

3
您展示的代码只是您的类的getLocation方法。假定您的类还实现了LocationListener,对吗?(在没有看到它的情况下假定它是这样,因为您在requestLocationUpdates中分配了“this”作为监听器。)您展示的方法只会返回最后已知位置,因为通过提供程序进行的位置更新是异步的。您指示希望通过注册侦听器来获取位置信息,并且该侦听器会定期获取更新(基于您提供的设置以及实际设备功能和情况)。注册后不会立即获得位置。在您的问题的情况下,在未连接到网络时获取位置信息,您需要使用GPS提供程序(它可以在未连接到数据网络时运行)。一旦您注册了GPS提供程序侦听器(就像您已经这样做的那样),您将通过侦听器中的回调onLocationChanged(Location location)获取位置更新。您的onLocationChanged回调函数是做什么用的?

当你注册GPS提供程序后,几秒到几分钟后你就可以在那里得到更新的位置信息(速度取决于你使用的设备硬件和环境条件,GPS使用多颗卫星,在视野开阔的情况下工作更快,如果你在室内或信号受阻时可能不起作用)。

除了等待侦听器获取更新的位置信息外,您还可以考虑使用一些更简单、独立的方法来获取最后已知位置并注册最佳提供程序。您可以使用一些简单的循环和您感兴趣的Criteria(COARSE vs FINE,LOW_POWER或否等)。 Android开发人员在文档中对此进行了很好的记录,并在“位置技巧”开源示例应用程序和“深入挖掘”博客文章中详细介绍了这些内容(其中包含所有其他资源的链接):http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html


-2

即使没有互联网和GPS,您也可以基于GSM(蜂窝网络)获取位置。

NETWORK_PROVIDER将根据可用的GSM或wifi解析。当然,关闭wifi后将使用GSM。但是,蜂窝网络的精度可能从500米到2000米不等。


海报已经知道了网络提供商,并在原始问题中进行了分配。问题在于他没有等待听众。(此外,网络提供商并不总是使用“GSM或Wifi”,并非所有设备都是GSM。而且,网络提供商可能比最小500米更精确,虽然可能不是最佳情况。) - Charlie Collins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接