Obtenez la position actuelle de l'utilisateur dans Android sans utiliser le GPS ou Internet

91

Est-il possible d'obtenir la position actuelle de l'utilisateur sans utiliser le GPS ou Internet? Je veux dire avec l'aide d'un fournisseur de réseau mobile.

Prabhu M
la source
1
La réponse acceptée fonctionne-t-elle parfaitement? Pour moi ça ne marche pas ... !!!
Samitha Chathuranga
3
Malheureusement, la réponse acceptée est fausse :-( Étonnant qu'il ait obtenu 28 votes positifs même s'il ne répond pas correctement à la question!
David Wasser
@DavidWasser Merci de vos précieux commentaires. Et pensez-vous qu'il n'existe en fait aucune méthode pour obtenir les détails de l'emplacement sans utiliser Internet ou le GPS? (autrement qu'en utilisant les messages diffusés par cette cellule)
Samitha Chathuranga
2
@SamithaChathuranga Pensez à ceci: si vous n'avez pas de GPS et que vous n'avez pas Internet, où allez-vous obtenir ces informations? Vous pouvez obtenir les informations d'identification de cellule à partir du réseau. Cela vous donne uniquement l'ID. Vous auriez alors besoin d'un moyen de mapper l'ID à une coordonnée ou un nom réel. Vous pouvez toujours créer votre propre base de données d'identification de cellule et l'inclure dans votre application, mais il vous faudrait beaucoup de travail pour collecter toutes ces données et la cartographie n'est pas statique: cela change à mesure que les opérateurs mobiles installent de nouvelles tours de téléphonie cellulaire et renumérotent leurs réseaux. Fondamentalement, la réponse pratique est «non».
David Wasser
@DavidWasser Merci pour la réponse. J'ai également eu une grande surprise de savoir comment obtenir l'emplacement sans Internet ni GPS. Mais on dit que cela est possible en incluant stackoverflow dans de nombreux forums. C'est pourquoi j'ai pensé que ce serait possible. Il semble que beaucoup de gens se trompent aussi.
Samitha Chathuranga

Réponses:

87

Ce que vous cherchez à faire est d’obtenir la position en utilisant au LocationManager.NETWORK_PROVIDERlieu de LocationManager.GPS_PROVIDER. Le NETWORK_PROVIDERsera résolu sur le GSM ou le wifi, qui est toujours disponible. Évidemment, avec le wifi désactivé, le GSM sera utilisé. Gardez à l'esprit que l'utilisation du réseau cellulaire est précise à environ 500 m.

http://developer.android.com/guide/topics/location/obtaining-user-location.html contient de très bonnes informations et des exemples de code.

Une fois que vous avez terminé avec la plupart du code OnCreate(), ajoutez ceci:

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

Vous pouvez également demander à votre activité de mettre en œuvre la LocationListenerclasse et donc de la mettre onLocationChanged()en œuvre dans votre activité.

Ian
la source
1
n'oubliez pas de consulter les stratégies de conservation de la batterie. De plus, selon votre application, PASSIVE_PROVIDER et l'utilisation de getLastKnownLocation peuvent vous faire économiser beaucoup de travail et de batterie si d'autres applications utilisent les antennes.
Ian
2
Hey @Ian, j'ai utilisé le même code .. Mais dans mon cas, la méthode d'écoute onLocationChanged () n'a jamais été appelée. J'ai utilisé requestLocationUpdates sur la méthode onResume (). toujours il n'a jamais appelé .. Alors quel était le problème là-bas?
MS.
2
Hey @lan ou toute autre personne qui peut m'aider, j'ai implémenté le code ci-dessus, mais la méthode onLocationChanged n'est jamais appelée quel serait le problème quelqu'un peut-il m'aider s'il vous plaît .....
pareshm
1
Est-il possible d'obtenir les coordonnées sans Internet? Dans certains appareils, cela ne fonctionne pas.
iammilind
20
Cette réponse est erronée :-( OP a demandé comment obtenir la position sans utiliser de connexion Internet. LOCATION_PROVIDER doit utiliser Internet pour accéder aux serveurs afin de convertir une collection d'adresses MAC Cell-ID et WIFI en coordonnées géographiques. Si vous n'avez pas Internet connexion, vous ne pourrez pas obtenir de coordonnées. Si vous me dites que cela fonctionne pour vous, cela signifie que vous avez une connexion Internet ou que vous avez une connexion Internet (l'API de localisation télécharge et met en cache certaines informations sur la zone autour de vous) , ou les informations de localisation sont anciennes (et donc inexactes).
David Wasser
16

En obtenant le, getLastKnownLocationvous n'initiez pas vous-même une solution.

Sachez que cela pourrait démarrer le fournisseur, mais si l'utilisateur a déjà obtenu un emplacement auparavant, je ne pense pas qu'il le fera. Les documents ne sont pas vraiment trop clairs à ce sujet.

Selon la documentation getLastKnownLocation:

Renvoie un emplacement indiquant les données du dernier correctif d'emplacement connu obtenu du fournisseur donné. Cela peut être fait sans démarrer le fournisseur.

Voici un petit extrait:

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

Vous devez également ajouter une nouvelle autorisation à AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
hwrdprkns
la source
Ce que je pense, c'est: est-il possible d'obtenir l'emplacement actuel en utilisant le réseau mobile
Prabhu M
Vous devez lire les documents. Découvrez les différences entre PASSIVE_PROVIDER, NETWORK_PROVIDERet GPS_PROVIDER.
hwrdprkns
1
Bien que ce soit idéal, je vérifierais l'heure du dernier emplacement en utilisant getTime (). Ensuite, il s'agit simplement de décider de l'âge que vous autoriserez. S'il est trop ancien, obtenez un nouveau poste en utilisant mon message.
Ian
1
@Ian Comment obtenir le nouvel emplacement ou le nouvel emplacement?
Archie.bpgc
5
Pouvons-nous obtenir l'emplacement si le GPS est désactivé
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
la source
4

Non, vous ne pouvez actuellement pas obtenir de position sans utiliser le GPS ou Internet.

Les techniques de localisation basées sur WiFi, Cellulaire ou Bluetooth fonctionnent à l'aide d'une grande base de données constamment mise à jour. Un appareil recherche les identifiants des émetteurs, puis les envoie dans une requête via Internet à un service tel que Google, Apple ou Skyhook. Ce service répond avec un emplacement basé sur des enquêtes sans fil précédentes à partir d'emplacements connus. Sans accès Internet, vous devez disposer d'une copie locale d'une telle base de données et la maintenir à jour. Pour une utilisation globale, cela est très peu pratique.

Théoriquement, un fournisseur de téléphonie mobile pourrait fournir uniquement un service de données local, mais pas d'accès à Internet, puis répondre aux requêtes de localisation à partir d'appareils mobiles. Les fournisseurs de téléphonie mobile ne font pas cela; personne ne veut payer pour ce type d'accès restreint aux données. Si vous disposez d'un service de données via votre fournisseur de téléphonie mobile, vous avez accès à Internet.

En bref, l'utilisation de LocationManager.NETWORK_PROVIDER ou android.hardware.location.network pour obtenir l'emplacement nécessite l'utilisation d'Internet.

Pour utiliser la dernière position connue, vous devez avoir un accès GPS ou Internet très récemment. Si vous venez d'avoir Internet, vous pouvez probablement ajuster votre position ou vos paramètres pour accéder à nouveau à Internet. Si votre appareil n'a pas accès au GPS ou à Internet, la dernière fonction de position connue ne vous aidera pas.

Sans GPS ni Internet, vous pourriez:

  1. Prenez des photos du ciel nocturne et utilisez l'heure actuelle pour estimer votre position sur la base d'une carte des étoiles. Cela nécessiterait probablement un équipement supplémentaire pour garantir que les angles de vos photos sont correctement mesurés.
  2. Utilisez un accéléromètre pour suivre l'emplacement à partir d'une position connue. L'accumulation d'erreurs dans ce type d'approche la rend impraticable dans la plupart des situations.
mattm
la source
3

Ici possible pour obtenir l'emplacement actuel de l'utilisateur sans l'utilisation du GPS et du fournisseur de réseau.

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

2. Cliquez ici pour votre référence

Bonbons Mahendran
la source
2

Avez-vous jeté un œil à l'API de géolocalisation Google Maps? Géolocalisation Google Map

C'est simple RestApi, il vous suffit de POSTER une demande, le service retournera un emplacement avec une précision en mètres.

raditya gumay
la source
-2

Vous pouvez utiliser TelephonyManager pour ce faire.

Ggps Shubham Kumar Gupta
la source
Comment pouvez-vous l'utiliser?
CoolMind