Получите текущее местоположение пользователя в Android без использования GPS или Интернета


91

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


1
Принятый ответ работает идеально? У меня не работает ... !!!
Самита Чатуранга

3
К сожалению, принятый ответ неверен :-( Удивительно, что он получил 28 голосов, хотя он не отвечает на вопрос правильно!
Дэвид Вассер,

@DavidWasser Цените ваши ценные комментарии. И вы думаете, что на самом деле нет никакого способа получить данные о местоположении без использования интернета или GPS? (кроме использования сообщений этой сотовой трансляции)
Самита Чатуранга,

2
@SamithaChathuranga Подумайте об этом: если у вас нет GPS и нет Интернета, где вы собираетесь получить эту информацию? Вы можете получить информацию об идентификаторе соты из сети. Это дает вам только идентификатор. Затем вам понадобится способ сопоставить идентификатор с фактической координатой или именем. Вы всегда можете создать свою собственную базу данных идентификаторов сот и включить ее в свое приложение, но вам потребуется очень много работы, чтобы собрать все эти данные, и отображение не является статическим: оно меняется, когда операторы мобильной связи устанавливают новые вышки сотовой связи и меняют нумерацию. их сети. По сути, практический ответ - «нет».
Дэвид Вассер

@DavidWasser Спасибо за ответ. Я также был большим сюрпризом, как определить местоположение без интернета или GPS. Но включение stackoverflow на многих форумах считается возможным. Вот почему я думал, что это возможно. Кажется, многие люди тоже заблуждаются.
Samitha Chathuranga

Ответы:


87

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

http://developer.android.com/guide/topics/location/obtain-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()в своей деятельности и, таким образом, реализовать в своей деятельности.


1
пожалуйста, не забудьте ознакомиться со стратегиями экономии заряда батареи. Кроме того, в зависимости от вашего приложения, PASSIVE_PROVIDER и использование getLastKnownLocation могут сэкономить вам много работы и батарею, если другие приложения используют антенны.
Ян

2
Привет, @Ian, я использовал тот же код .. Но в моем случае метод прослушивателя onLocationChanged () никогда не вызывался. Я использовал requestLocationUpdates в методе onResume (). до сих пор он никогда не звонил .. Так что там было проблемой?
ср.

2
Привет, @lan или любой другой человек, который может мне помочь, я реализовал приведенный выше код, но метод onLocationChanged не вызывается, в чем может быть проблема, может ли кто-нибудь мне помочь, пожалуйста ...
pareshm

1
Можно ли получить координаты без интернета? В некоторых устройствах вроде не работает.
iammilind

20
Этот ответ неверен :-( OP спросил, как определить местоположение без использования подключения к Интернету. LOCATION_PROVIDER необходимо использовать Интернет для доступа к серверам, чтобы преобразовать набор MAC-адресов Cell-ID и WIFI в географические координаты. Если у вас нет Интернета вы не сможете получить координаты. Если вы скажете мне, что это работает для вас, это означает, что либо у вас есть подключение к Интернету, либо у вас есть подключение к Интернету (API местоположения загружает и кеширует некоторую информацию о местности вокруг вас) , или информация о местоположении устарела (и поэтому неточна).
Дэвид Вассер,

16

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

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

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

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

Вот небольшой фрагмент:

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" />

Я думаю, можно ли узнать текущее местоположение с помощью мобильной сети
Прабху М.

Вам нужно прочитать документацию. Изучают различия между PASSIVE_PROVIDER, NETWORK_PROVIDERи GPS_PROVIDER.
hwrdprkns

1
Хотя это идеальный вариант, я бы проверил время последнего местоположения с помощью getTime (). Тогда остается только решить, сколько лет вы позволите этому быть. Если он слишком старый, то получи новую должность с помощью моего поста.
Ян

1
@Ian Как получить новую или свежую локацию?
Archie.bpgc

5
Можем ли мы определить местоположение, если GPS отключен
Прасад

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

4

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

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

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

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

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

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

  1. Сфотографируйте ночное небо и используйте текущее время, чтобы оценить свое местоположение на основе карты звездного неба. Это, вероятно, потребует дополнительного оборудования для правильного измерения углов для ваших изображений.
  2. Используйте акселерометр, чтобы отслеживать местоположение, начиная с известного положения. Накопление ошибок в таком подходе делает его непрактичным в большинстве ситуаций.



-1

Оказывается, можно отслеживать смартфон без использования GPS.

Источники:

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

Дополнительный: «Как отслеживать мобильный телефон без GPS или согласия»

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.