【问题标题】:How to get current exact location in android without internet connection?如何在没有互联网连接的情况下在 android 中获取当前的确切位置?
【发布时间】:2013-02-17 16:58:41
【问题描述】:

我想在 android 中获取当前的确切位置坐标。如果手机连接到 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;
}

【问题讨论】:

  • 安卓使用AGPS,你不能。
  • @Raghav Sood 没有办法解决我的问题??
  • AGPS 代表辅助 GPS。在此,GPS 模块由来自互联网的数据辅助。没有互联网 = 没有 AGPS
  • 您的问题实际上是当 NETWORK AND GPS 提供商都被禁用时,您如何获取位置? (因为 GPS 在没有网络的情况下工作。)你不能。您可以使用最近的已知位置,但如果没有启用其中一个提供程序,您将无法获得新的位置更新。
  • 另外,如果您使用 Criteria 并且只是遍历可用的提供程序并分配第一个满足您条件的提供程序,您的代码会简单得多。

标签: android android-location


【解决方案1】:

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

您展示的方法只会返回 LAST KNOWN 位置,因为通过提供程序进行的位置更新是异步。您表明您希望通过注册监听器来获取位置信息,并且 listener 会定期获取更新(基于您为其提供的设置,以及基于实际设备功能和环境)。注册后您不会立即取回该位置。

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

您的onLocationChanged 回调有什么作用?

在您注册 GPS 提供商后的几秒到几分钟内,您将在此处获得更新的位置信息(多长时间取决于您使用的设备中的硬件和环境条件,GPS 使用多个卫星并且工作速度更快在天空清晰的情况下,如果您在室内或信号受到阻碍,它可能根本无法工作。

除了等待侦听器为您提供更新的位置信息外,您可能还需要考虑使用一些更简单、独立的方法来获取最后一个已知位置并注册最佳提供商。您可以使用一些简单的循环和您感兴趣的Criteria(COARSE 与 FINE、LOW_POWER 或非等)。

Android 开发人员在文档、“Protips for Location”开源示例应用程序和“Deep Dive”博客文章(其中包含指向所有其他资源的链接)中已经很好地记录了这一点:@987654321 @。

【讨论】:

    【解决方案2】:

    无需互联网和 GPS,您可以基于 GSM(蜂窝网络)获取位置。

    NETWORK_PROVIDER 将在可用的 GSM 或 wifi 上解析。显然,在关闭 wifi 的情况下,将使用 GSM。但是,蜂窝网络的精度可能会在 500m 到 2000M 之间变化。

    【讨论】:

    • 发帖人已经知道网络提供商,并在原始问题中分配它。问题是他不等待听众。 (此外,网络提供商不会总是使用“GSM 或 Wifi”,并非所有设备都是 GSM。网络提供商可以比最小 500m 更准确,当然可能不是,但这不是最好的情况。)
    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2011-08-26
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多