Obtenha a localização atual do usuário no Android sem usar GPS ou internet

91

É possível obter a localização atual do usuário sem usar GPS ou a internet? Quero dizer, com a ajuda do provedor de rede móvel.

Prabhu M
fonte
1
A resposta aceita funciona perfeitamente? Para mim não está funcionando ... !!!
Samitha Chathuranga
3
Infelizmente, a resposta aceita está errada :-( Incrível que tenha obtido 28 votos positivos, embora não tenha respondido a pergunta corretamente!
David Wasser
@DavidWasser Agradeço seus valiosos comentários. E você acha que realmente não existe nenhum método para obter os detalhes de localização sem usar internet ou GPS? (exceto pelo uso de mensagens de transmissão celular)
Samitha Chathuranga
2
@SamithaChathuranga Pense nisso: se você não tem GPS e não tem Internet, onde você vai conseguir essa informação? Você pode obter as informações de identificação do celular na rede. Isso fornece apenas o ID. Você precisaria então de uma maneira de mapear o ID para uma coordenada ou nome real. Você sempre pode construir seu próprio banco de dados de ID de celular e incluí-lo em seu aplicativo, mas seria muito trabalhoso coletar todos esses dados e o mapeamento não é estático: ele muda conforme as operadoras de celular instalam novas torres de celular e renumeram suas redes. Basicamente, a resposta prática é "não".
David Wasser
@DavidWasser Obrigado pela resposta. Também tive uma grande surpresa como conseguir a localização sem internet ou GPS. Mas, incluindo stackoverflow em muitos fóruns, isso é considerado possível. É por isso que pensei que seria possível. Parece que muitas pessoas também estão equivocadas.
Samitha Chathuranga

Respostas:

87

O que você está procurando fazer é obter a posição usando o em LocationManager.NETWORK_PROVIDERvez de LocationManager.GPS_PROVIDER. O NETWORK_PROVIDERresolverá no GSM ou wi-fi, o que estiver disponível. Obviamente, com o wi-fi desligado, o GSM será usado. Lembre-se de que o uso da rede celular tem uma precisão de basicamente 500m.

http://developer.android.com/guide/topics/location/obtaining-user-location.html tem algumas informações realmente excelentes e um código de amostra.

Depois de concluir a maior parte do código OnCreate(), adicione o seguinte:

// 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);

Você também pode fazer com que sua atividade implemente a LocationListenerclasse e, portanto, implemente onLocationChanged()em sua atividade.

Ian
fonte
1
lembre-se de verificar as estratégias de preservação da bateria. Além disso, dependendo do seu aplicativo, o PASSIVE_PROVIDER e o uso de getLastKnownLocation podem economizar muito trabalho e bateria se outros aplicativos estiverem usando as antenas.
Ian
2
Ei @Ian, usei o mesmo código .. Mas no meu caso, o método de ouvinte onLocationChanged () nunca chamou. Usei requestLocationUpdates no método onResume (). ainda assim nunca ligou .. Então, qual foi o problema lá?
MS.
2
Ei @lan ou qualquer outra pessoa que possa me ajudar eu implementei o código acima, mas o método onLocationChanged neved é chamado qual seria o problema, qualquer um pode me ajudar, por favor ...
pareshm
1
É possível obter as coordenadas sem internet? Em alguns dos dispositivos, parece não funcionar.
iammilind
20
Esta resposta está errada :-( OP perguntou como obter localização sem usar uma conexão com a Internet. LOCATION_PROVIDER precisa usar a Internet para acessar servidores para resolver uma coleção de endereços MAC de Cell-ID e WIFI em uma coordenada geográfica. Se você não tiver Internet conexão, você não poderá obter uma coordenada. Se você me disser que funciona para você, significa que você tem uma conexão com a Internet ou tinha uma conexão com a Internet (a API de localização baixa e armazena em cache algumas informações sobre a área ao seu redor) , ou as informações de localização são antigas (e, portanto, imprecisas).
David Wasser
16

Ao obter o, getLastKnownLocationvocê não inicia a correção sozinho.

Esteja ciente de que isso pode iniciar o provedor, mas se o usuário já obteve uma localização antes, não acho que o fará. Os documentos não são muito claros sobre isso.

De acordo com os documentos getLastKnownLocation:

Retorna um local indicando os dados da última correção de local conhecida obtida do provedor fornecido. Isso pode ser feito sem iniciar o provedor.

Aqui está um snippet rápido:

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

Você também deve adicionar uma nova permissão para AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
hwrdprkns
fonte
O que estou pensando é: é possível obter a localização atual usando a rede móvel
Prabhu M
Você precisa ler os documentos. Saiba as diferenças entre PASSIVE_PROVIDER, NETWORK_PROVIDERe GPS_PROVIDER.
hwrdprkns
1
Embora isso seja ideal, eu verificaria a hora do último local usando getTime (). Então, é só uma questão de decidir quantos anos você permitirá que isso tenha. Se for muito antigo, consiga uma nova posição usando meu post.
Ian
1
@Ian Como obter um local novo ou fresco?
Archie.bpgc
5
Podemos obter a localização se o GPS estiver desligado
Prasad
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;
    }
}
Makvin
fonte
4

Não, atualmente você não pode obter a localização sem usar GPS ou Internet.

As técnicas de localização baseadas em WiFi, celular ou Bluetooth funcionam com a ajuda de um grande banco de dados que está em constante atualização. Um dispositivo procura IDs de transmissor e os envia em uma consulta pela Internet para um serviço como Google, Apple ou Skyhook. Esse serviço responde com um local com base em pesquisas sem fio anteriores de locais conhecidos. Sem acesso à Internet, você deve ter uma cópia local desse banco de dados e mantê-la atualizada. Para uso global, isso é muito impraticável.

Teoricamente, um provedor móvel poderia fornecer apenas serviço de dados local, mas sem acesso à Internet, e então responder a consultas de localização de dispositivos móveis. Provedores de celular não fazem isso; ninguém quer pagar por esse tipo de acesso restrito aos dados. Se você tiver serviço de dados por meio de sua operadora de celular, terá acesso à Internet.

Resumindo, o uso de LocationManager.NETWORK_PROVIDER ou android.hardware.location.network para obter a localização requer o uso da Internet.

Usar a última posição conhecida exige que você tenha acesso ao GPS ou à Internet recentemente. Se você acabou de ter internet, provavelmente você pode ajustar sua posição ou configurações para ter internet novamente. Se o seu dispositivo não tiver GPS ou acesso à Internet, o último recurso de posição conhecido não o ajudará.

Sem GPS ou internet, você poderia:

  1. Tire fotos do céu noturno e use a hora atual para estimar sua localização com base em um mapa estelar. Isso provavelmente exigiria equipamento adicional para garantir que os ângulos das fotos sejam medidos corretamente.
  2. Use um acelerômetro para rastrear a localização a partir de uma posição conhecida. O acúmulo de erros nesse tipo de abordagem o torna impraticável para a maioria das situações.
mattm
fonte
3

Aqui é possível obter a localização atual do usuário sem o uso de GPS e provedor de rede.

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

2. Clique aqui para sua referência

Doces Mahendran
fonte
2

Você já deu uma olhada no Google Maps Geolocation Api? Geolocalização do Google Map

Este é o RestApi simples, você só precisa fazer um POST de uma solicitação, o serviço irá retornar uma localização com precisão em metros.

Raditya Gumay
fonte
-2

Você pode usar o TelephonyManager para fazer isso.

Shubham Kumar Gupta Ggps
fonte
Como você pode usar isso?
CoolMind