Как получить текущее точное местоположение в Android без подключения к интернету?

Я хочу получить текущие точные координаты местоположения в Android. Я могу получить местоположение, если мобильное устройство подключено к интернет-соединению Wifi, но в другом случае, когда я иду куда-то еще и интернет-соединение недоступно, тогда оно не дает координаты текущего местоположения. вместо этого давая последние координаты местоположения.

Например:

В настоящее время я нахожусь в городе А и получаю текущие координаты через соединение Wi-Fi и перехожу в город Б, тогда я не могу получить текущие координаты. Вместо этого он дает последние координаты местоположения.

Может ли кто-нибудь предложить мне, как я могу получить текущее местоположение без подключения к интернету.

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;
}

2 ответа

Код, который вы показываете, это просто getLocation метод вашего класса. Предположительно, ваш класс также реализует LocationListener, правильный? (Предполагая, что он не видит, потому что вы назначаете "это" в requestLocationUpdates как слушатель.)

Метод, который вы показали, только когда-либо возвращает местоположение ПОСЛЕДНЕЕ ИЗВЕСТНОЕ, потому что обновления местоположения через провайдеров являются асинхронными. Вы указываете, что хотите получить информацию о местонахождении путем регистрации прослушивателя и что прослушиватель периодически получает обновления (в зависимости от заданных вами настроек и исходя из реальных возможностей устройства и обстоятельств). Вы НЕ получите обратно местоположение сразу после регистрации.

В случае вашего вопроса, для получения информации о местонахождении, НЕ подключенной к сети, вам нужно будет использовать провайдера GPS (он работает, когда не подключен к сети передачи данных). Как только вы зарегистрируете приемник GPS-провайдера (как у вас уже есть), вы получите обновления местоположения посредством обратного вызова в приемнике, onLocationChanged(Location location),

Что делает твой onLocationChanged обратный звонок делать?

Именно здесь вы получите обновленную информацию о местоположении через несколько секунд или минут после регистрации провайдера GPS (как скоро зависит от аппаратного обеспечения устройства, которое вы используете, и от условий окружающей среды, GPS использует несколько спутников и работает быстрее с четким вид на небо, он может не работать вообще, если вы находитесь в помещении или сигнал иным образом затруднен).

В дополнение к ожиданию получения от слушателя обновленной информации о местоположении, вы также можете рассмотреть возможность использования более простых, отдельных методов, чтобы получить последнее известное местоположение и зарегистрироваться для получения лучшего поставщика. Вы можете использовать несколько простых циклов и Criteria Вы заинтересованы (COARSE против FINE, LOW_POWER или нет и т. д.).

Разработчики Android хорошо описали это в документации, а также в примере приложения с открытым исходным кодом "Protips for Location" и в блоге "Deep Dive" (в котором есть ссылки на все остальные ресурсы): http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html.

Без Интернета и GPS вы можете получить местоположение на основе GSM (сотовая сеть).

NETWORK_PROVIDER будет разрешать по GSM или Wi-Fi, которые когда-либо доступны. Очевидно, что при выключенном Wi-Fi будет использоваться GSM. Однако точность сотовой сети может варьироваться от 500 м до 2000 м.

Другие вопросы по тегам