Obtenga la ubicación actual del usuario en Android sin usar GPS o Internet

91

¿Es posible obtener la ubicación actual del usuario sin usar GPS o Internet? Me refiero a la ayuda del proveedor de red móvil.

Prabhu M
fuente
1
¿La respuesta aceptada funciona perfectamente? Para mí no está funcionando ... !!!
Samitha Chathuranga
3
Desafortunadamente, la respuesta aceptada es incorrecta :-( ¡Increíble que obtuvo 28 votos a favor aunque no responde la pregunta correctamente!
David Wasser
@DavidWasser Agradecemos sus valiosos comentarios. ¿Y cree que en realidad no existe ningún método para obtener los detalles de la ubicación sin usar Internet o GPS? (que no sea mediante el uso de mensajes de transmisión celular)
Samitha Chathuranga
2
@SamithaChathuranga Piensa en esto: si no tienes GPS y no tienes Internet, ¿de dónde vas a conseguir esta información? Puede obtener la información de identificación de la celda de la red. Esto le da solo la identificación. Luego, necesitaría una forma de asignar el ID a una coordenada o nombre real. Siempre puede crear su propia base de datos de identificación de celulares e incluirla en su aplicación, pero le tomaría mucho trabajo recopilar todos esos datos y el mapeo no es estático: cambia a medida que los operadores móviles instalan nuevas torres de celulares y renumeran sus redes. Básicamente, la respuesta práctica es "no".
David Wasser
@DavidWasser Gracias por la respuesta. También tuve una gran sorpresa de cómo obtener la ubicación sin internet ni gps. Pero se dice que esto es posible incluir stackoverflow en muchos foros. Por eso pensé que sería posible. Parece que mucha gente también está equivocada.
Samitha Chathuranga

Respuestas:

87

Lo que busca hacer es obtener la posición usando el en LocationManager.NETWORK_PROVIDERlugar de LocationManager.GPS_PROVIDER. El NETWORK_PROVIDERse resolverá en GSM o wifi, lo que esté disponible. Obviamente, con wifi desactivado, se utilizará GSM. Tenga en cuenta que el uso de la red celular tiene una precisión de 500 m.

http://developer.android.com/guide/topics/location/obtaining-user-location.html tiene muy buena información y código de muestra.

Una vez que haya terminado con la mayor parte del código OnCreate(), agregue esto:

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

También puede hacer que su actividad implemente la LocationListenerclase y así implementarla onLocationChanged()en su actividad.

Ian
fuente
1
recuerde revisar las estrategias para la conservación de la batería. Además, dependiendo de su aplicación, el PASSIVE_PROVIDER y el uso de getLastKnownLocation pueden ahorrarle mucho trabajo y batería si otras aplicaciones están usando las antenas.
Ian
2
Hola @Ian, he usado el mismo código ... Pero en mi caso, el método de escucha onLocationChanged () nunca se llamó. Usé requestLocationUpdates en el método onResume (). todavía nunca llamó .. Entonces, ¿qué había sido el problema allí?
MS.
2
Hola @lan o cualquier otra persona que pueda ayudarme, implementé el código anterior, pero se llama al método onLocationChanged neved, cuál sería el problema, ¿alguien puede ayudarme, por favor ...?
pareshm
1
¿Es posible obtener las coordenadas sin internet? En algunos de los dispositivos parece no funcionar.
iammilind
20
Esta respuesta es incorrecta :-( OP preguntó cómo obtener la ubicación sin usar una conexión a Internet. LOCATION_PROVIDER necesita usar Internet para acceder a los servidores para resolver una colección de direcciones MAC de ID de celular y WIFI en una coordenada geográfica. Si no tiene Internet conexión, no podrá obtener una coordenada. Si me dice que funciona para usted, significa que tiene una conexión a Internet o que tenía una conexión a Internet (la API de ubicación descarga y almacena en caché cierta información sobre el área que lo rodea) , o la información de ubicación es antigua (y por lo tanto inexacta).
David Wasser
16

Al obtener el getLastKnownLocation, no inicia una solución usted mismo.

Tenga en cuenta que esto podría iniciar el proveedor, pero si el usuario alguna vez obtuvo una ubicación antes, no creo que lo haga. Los documentos no son demasiado claros al respecto.

De acuerdo con los documentos getLastKnownLocation:

Devuelve una ubicación que indica los datos de la última corrección de ubicación conocida obtenida del proveedor dado. Esto se puede hacer sin iniciar el proveedor.

Aquí hay un fragmento 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;
    }
}

También debe agregar un nuevo permiso para AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
hwrdprkns
fuente
Lo que estoy pensando es, ¿es posible obtener la ubicación actual usando la red móvil
Prabhu M
Necesitas leer los documentos. Aprender las diferencias entre PASSIVE_PROVIDER, NETWORK_PROVIDERy GPS_PROVIDER.
hwrdprkns
1
Aunque esto es ideal, comprobaría la hora de la última ubicación usando getTime (). Entonces, solo es cuestión de decidir cuántos años permitirás que tenga. Si es demasiado antiguo, obtenga un nuevo puesto utilizando mi publicación.
Ian
1
@Ian ¿Cómo obtener la ubicación nueva o nueva?
Archie.bpgc
5
¿Podemos obtener la ubicación si el GPS está desactivado
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
fuente
4

No, actualmente no puede obtener la ubicación sin usar GPS o Internet.

Las técnicas de localización basadas en WiFi, Celular o Bluetooth funcionan con la ayuda de una gran base de datos que se actualiza constantemente. Un dispositivo busca los ID de los transmisores y luego los envía en una consulta a través de Internet a un servicio como Google, Apple o Skyhook. Ese servicio responde con una ubicación basada en encuestas inalámbricas anteriores de ubicaciones conocidas. Sin acceso a Internet, debe tener una copia local de dicha base de datos y mantenerla actualizada. Para el uso global, esto es muy poco práctico.

Teóricamente, un proveedor de telefonía móvil podría proporcionar servicios de datos locales únicamente, pero sin acceso a Internet, y luego responder consultas de ubicación desde dispositivos móviles. Los proveedores móviles no hacen esto; nadie quiere pagar por este tipo de acceso restringido a los datos. Si tiene servicio de datos a través de su proveedor de telefonía móvil, entonces tiene acceso a Internet.

En resumen, el uso de LocationManager.NETWORK_PROVIDER o android.hardware.location.network para obtener la ubicación requiere el uso de Internet.

El uso de la última posición conocida requiere que haya tenido acceso a Internet o GPS recientemente. Si acaba de tener Internet, presumiblemente puede ajustar su posición o configuración para volver a tener Internet. Si su dispositivo no ha tenido GPS o acceso a Internet, la última función de posición conocida no le ayudará.

Sin GPS o Internet, podría:

  1. Tome fotografías del cielo nocturno y use la hora actual para estimar su ubicación en función de un mapa estelar. Esto probablemente requeriría equipo adicional para garantizar que los ángulos de sus imágenes se midan correctamente.
  2. Utilice un acelerómetro para rastrear la ubicación a partir de una posición conocida. La acumulación de errores en este tipo de enfoque lo hace poco práctico para la mayoría de las situaciones.
Mattm
fuente
3

Aquí es posible obtener la ubicación actual del usuario sin el uso de GPS y proveedor de red.

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

2. Haga clic aquí para su referencia

Caramelo Mahendran
fuente
2

¿Has echado un vistazo a la API de geolocalización de Google Maps? Geolocalización de Google Map

Esto es RestApi simple, solo necesita POST una solicitud, el servicio devolverá una ubicación con precisión en metros.

raditya gumay
fuente
-2

Puede usar TelephonyManager para hacer eso.

Shubham Kumar Gupta Ggps
fuente
¿Cómo puedes utilizarlo?
CoolMind