Android 如何在没有互联网连接的情况下在安卓系统中获得当前的准确位置?

Android 如何在没有互联网连接的情况下在安卓系统中获得当前的准确位置?,android,android-location,Android,Android Location,我想在android中获得当前的精确位置坐标。如果移动设备连接到Wifi互联网连接,我可以获取位置,但在其他情况下,当我去其他地方时,没有可用的互联网连接,则它不会给出当前位置坐标。而是给出最后的位置坐标 例如: 目前我在一个城市,通过wifi连接获取当前坐标,然后移动到城市B,然后我无法获取当前坐标。而不是给出最后的位置坐标 有谁能建议我如何在没有互联网连接的情况下获取当前位置 public Location getLocation() { try { location

我想在android中获得当前的精确位置坐标。如果移动设备连接到Wifi互联网连接,我可以获取位置,但在其他情况下,当我去其他地方时,没有可用的互联网连接,则它不会给出当前位置坐标。而是给出最后的位置坐标

例如:

目前我在一个城市,通过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;
}

您显示的代码只是类的
getLocation
方法。想必您的类也实现了
LocationListener
,对吗?(假设它没有看到它,因为您在
requestLocationUpdates
中将“this”指定为侦听器。)

您显示的方法将只返回最后一个已知位置,因为通过提供程序进行的位置更新是异步的。您表示希望通过注册侦听器来获取位置信息,侦听器定期获取更新(基于您提供的设置,以及实际的设备功能和环境)。注册后,您不会立即返回该位置

对于您的问题,在未连接到网络的情况下获取位置信息,您需要使用GPS提供商(它在未连接到数据网络的情况下工作)。一旦您注册了GPS提供商侦听器(正如您已经注册的那样),您将通过侦听器中的回调获得位置更新,
onLocationChanged(location location)

您的
onLocationChanged
回调做什么

在注册GPS提供商几秒钟到几分钟后,您将在那里获得更新的位置信息(多久取决于您使用的设备中的硬件和环境条件,GPS使用多颗卫星,在天空清晰的情况下工作更快,如果您在室内或信号受到其他阻碍,它可能根本不工作)

<> P>除了等待侦听器获得更新的位置信息之外,您还可以考虑使用一些简单的、单独的方法来获取最后已知的位置并登记给最佳提供者。您可以使用一些简单的循环和标准您感兴趣(粗略VE,Lead Offic Poor或No.Car)。


Android开发人员在文档、开放源代码示例应用程序“Protips for Location”以及“Deep Dive”博客文章(其中包含指向所有其他资源的链接)中对此进行了很好的记录。

如果没有互联网和GPS,您可以基于GSM(手机网络)获取位置


网络提供商将在GSM或wifi上解决问题,这是任何时候都可以使用的。显然,在wifi关闭的情况下,将使用GSM。但是,手机网络的精度可能在500米到2000米之间变化。

由于安卓使用AGPS,您不能。@Raghav Sood无法解决我的问题??AGPS代表辅助GPS。在这种情况下,GPS模块由数据辅助摘自互联网。无互联网=无AGP您的问题是,当网络和GPS提供商都被禁用时,您实际上如何获得位置?(因为GPS在没有网络的情况下工作。)您不能。您可以使用最后已知的位置,但如果未启用其中一个提供程序,则无法获得新的位置更新。此外,如果您使用标准并循环通过可用的提供程序并分配第一个符合您标准的提供程序,则代码会简单得多。海报已经了解网络提供程序,并且是assi在最初的问题中提到了这一点。问题是他没有等待听众。(此外,网络提供商不会总是使用“GSM或Wifi”,并非所有设备都是GSM。网络提供商可以比min 500米更精确,当然可能不是,但这不是它的最佳情况。)