Получить текущее местоположение пользователя в Android без использования GPS или интернета - PullRequest
89 голосов
/ 14 июля 2011

Можно ли узнать текущее местоположение пользователя без использования GPS или интернета? Я имею в виду с помощью оператора мобильной связи.

Ответы [ 8 ]

84 голосов
/ 14 июля 2011

Что вы хотите сделать, так это получить позицию, используя LocationManager.NETWORK_PROVIDER вместо LocationManager.GPS_PROVIDER.NETWORK_PROVIDER будет разрешаться по GSM или Wi-Fi, которые когда-либо доступны.Очевидно, что при выключенном Wi-Fi будет использоваться GSM.Имейте в виду, что использование сотовой сети с точностью до 500м.

http://developer.android.com/guide/topics/location/obtaining-user-location.html содержит некоторую действительно полезную информацию и пример кода.

После того, как вы закончите с большей частью кода в OnCreate(), добавьте это:

// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Called when a new location is found by the network location provider.
      makeUseOfNewLocation(location);
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Вы могли бы также, чтобы ваша деятельность реализовала класс LocationListener и, таким образом, включила onLocationChanged() в вашу деятельность.

15 голосов
/ 14 июля 2011

Получая getLastKnownLocation, вы фактически не инициируете исправление самостоятельно.

Имейте в виду, что это может запустить провайдера, но если пользователь когда-либо получал местоположение раньше, я не думаю, что это будет. Документы не слишком ясны по этому поводу.

Согласно документам getLastKnownLocation:

Возвращает местоположение с указанием данных из последнего известного местоположения исправить получено от данного провайдера. Это можно сделать без запуск провайдера.

Вот быстрый фрагмент:

import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import java.util.List;

public class UtilLocation {
    public static Location getLastKnownLoaction(boolean enabledProvidersOnly, Context context){
        LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        Location utilLocation = null;
        List<String> providers = manager.getProviders(enabledProvidersOnly);
        for(String provider : providers){

            utilLocation = manager.getLastKnownLocation(provider);
            if(utilLocation != null) return utilLocation;
        }
        return null;
    }
}

Вы также должны добавить новое разрешение к AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
3 голосов
/ 03 сентября 2017

Нет, вы не можете получить местоположение без использования GPS или интернета.

Методы определения местоположения на основе Wi-Fi, сотовой связи или Bluetooth работают с помощью большой базы данных, которая постоянно обновляется.Устройство сканирует идентификаторы передатчика и затем отправляет их в запросе через Интернет в службу, такую ​​как Google, Apple или Skyhook.Эта служба отвечает местоположением, основанным на предыдущих беспроводных опросах из известных местоположений.Без доступа к Интернету вы должны иметь локальную копию такой базы данных и поддерживать ее в актуальном состоянии.Для глобального использования это очень непрактично.

Теоретически, оператор мобильной связи может предоставлять только локальную услугу передачи данных, но не иметь доступа к Интернету, а затем отвечать на запросы местоположения с мобильных устройств.Операторы мобильной связи не делают этого;никто не хочет платить за такой ограниченный доступ к данным.Если у вас есть услуга передачи данных через вашего оператора мобильной связи, то у вас есть доступ в Интернет.

Короче говоря, использование LocationManager.NETWORK_PROVIDER или android.hardware.location.network для определения местоположения требует использования Интернета.

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

Без GPS или Интернета вы могли бы:

  1. Сфотографировать ночное небо и использовать текущее время, чтобы оценить ваше местоположение на основе звездной карты.Это, вероятно, потребует дополнительного оборудования для обеспечения правильного измерения углов для ваших изображений.
  2. Используйте акселерометр для отслеживания местоположения, начиная с известной позиции.Накопление ошибок в таком подходе делает его непрактичным для большинства ситуаций.
3 голосов
/ 14 декабря 2016
boolean gps_enabled = false;
boolean network_enabled = false;

LocationManager lm = (LocationManager) mCtx
                .getSystemService(Context.LOCATION_SERVICE);

gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

Location net_loc = null, gps_loc = null, finalLoc = null;

if (gps_enabled)
    gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (network_enabled)
    net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

if (gps_loc != null && net_loc != null) {

    //smaller the number more accurate result will
    if (gps_loc.getAccuracy() > net_loc.getAccuracy()) 
        finalLoc = net_loc;
    else
        finalLoc = gps_loc;

        // I used this just to get an idea (if both avail, its upto you which you want to take as I've taken location with more accuracy)

} else {

    if (gps_loc != null) {
        finalLoc = gps_loc;
    } else if (net_loc != null) {
        finalLoc = net_loc;
    }
}
3 голосов
/ 16 апреля 2016

Здесь можно получить текущее местоположение пользователя без использования GPS и сетевого провайдера.

1. Convert cellLocation to real location (Latitude and Longitude), using "http://www.google.com/glm/mmap"

2. Нажмите здесь для справки

1 голос
/ 11 июня 2016

Вы смотрели Google Maps Geolocation Api? Google Map Geolocation

Это простой RestApi, вам просто нужно POST запрос, служба вернет местоположение с точностью в метрах.

0 голосов
/ 02 апреля 2019

Вы можете использовать TelephonyManager для этого.

0 голосов
/ 01 июня 2018

Похоже, что смартфон можно отслеживать без использования GPS.

Источники:

Основной: "PinMe: отслеживание пользователя смартфона по всему миру"

Secondary: "Как отследить мобильный телефон без GPS или без согласия"

Я еще не нашел ссылку на окончательный код команды.Когда я это сделаю, я опубликую, если другой не сделал этого.

...