it-swarm.com.ru

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

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

86
Prabhu M

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

http://developer.Android.com/guide/topics/location/obtainment-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() в вашу деятельность.

80
Ian

Получив 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" />
14
hwrdprkns

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

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

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

4
Mahendran Candy
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
Makvin

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

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

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

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

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

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

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

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

0
Shubham Gupta Ggps

Вы смотрели Google Maps Geolocation Api? Географическое положение Google Map

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

0
raditya gumay