¿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.
¿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.
Respuestas:
Lo que busca hacer es obtener la posición usando el en LocationManager.NETWORK_PROVIDER
lugar de LocationManager.GPS_PROVIDER
. El NETWORK_PROVIDER
se 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 LocationListener
clase y así implementarla onLocationChanged()
en su actividad.
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" />
PASSIVE_PROVIDER
, NETWORK_PROVIDER
y GPS_PROVIDER
.
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;
}
}
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:
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"
¿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.
Parece que es posible rastrear un teléfono inteligente sin usar GPS.
Fuentes:
Principal: "PinMe: seguimiento de un usuario de smartphone en todo el mundo"
Secundaria: "Cómo rastrear un teléfono celular sin GPS o consentimiento"
Todavía no he encontrado un enlace al código final del equipo. Cuando lo haga, lo publicaré, si otro no lo ha hecho.