web-dev-qa-db-fra.com

Obtenir la position actuelle de l'utilisateur sur Android sans utiliser le GPS ou Internet

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

86
Prabhu M

Ce que vous cherchez à faire est d'obtenir le poste en utilisant le LocationManager.NETWORK_PROVIDER au lieu de LocationManager.GPS_PROVIDER. Le NETWORK_PROVIDER sera résolu sur le GSM ou le wifi, le cas échéant. De toute évidence, avec le Wi-Fi désactivé, le GSM sera utilisé. Gardez à l'esprit que l'utilisation du réseau cellulaire est précise à 500 m. 

http://developer.Android.com/guide/topics/location/obtaining-user-location.html contient de très bonnes informations et un exemple de code.

Une fois que vous avez terminé avec la plupart du code dans 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é d'implémenter la classe LocationListener et d'implémenter ainsi onLocationChanged() dans votre activité.

80
Ian

En obtenant la getLastKnownLocation vous n’installez pas réellement de solution vous-même.

Sachez que ceci pourrait démarrer le fournisseur, mais si l'utilisateur a déjà eu une localisation auparavant, je ne pense pas que ce sera le cas. Les documents ne sont pas vraiment clairs à ce sujet.

Selon la documentation getLastKnownLocation:

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

Voici un extrait rapide:

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 permission à AndroidManifest.xml

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
14
hwrdprkns
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

Non, vous ne pouvez pas actuellement localiser sans utiliser le GPS ou Internet. 

Les techniques de localisation basées sur le WiFi, la téléphonie cellulaire ou Bluetooth fonctionnent à l'aide d'une grande base de données constamment mise à jour. Un appareil recherche les identifiants d'émetteur, 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 précédentes sans fil à partir d'emplacements connus. Sans accès à Internet, vous devez disposer d'une copie locale d'une telle base de données et la conserver à jour. Pour une utilisation globale, ceci est très peu pratique. 

Théoriquement, un fournisseur de téléphonie mobile pourrait fournir un service de données local uniquement, mais pas d'accès à Internet, puis répondre aux requêtes d'emplacement à partir d'appareils mobiles. Les fournisseurs de services mobiles ne le font pas; 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 opérateur de téléphonie mobile, vous disposez d'un accès Internet. 

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

Pour utiliser la dernière position connue, vous devez avoir eu un accès GPS ou Internet très récemment. Si vous venez juste d'avoir Internet, vous pouvez probablement ajuster votre position ou vos paramètres pour obtenir à nouveau Internet. Si votre appareil n'a pas eu d'accès 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 à l'aide d'un diagramme en étoile. Cela nécessiterait probablement un équipement supplémentaire pour que les angles de vos images soient correctement mesurés. 
  2. Utilisez un accéléromètre pour suivre une position à partir d'une position connue. L’accumulation d’erreurs dans ce type d’approche le rend impraticable dans la plupart des situations. 
2
mattm

Vous pouvez utiliser TelephonyManager pour le faire.

0

Avez-vous jeter un oeil Google Maps Geolocation Api? Google Map Géolocalisation

Ceci est simple RestApi, vous avez juste besoin de POST une demande, le service retournera un emplacement avec une précision en mètres.

0
raditya gumay