studio - Android: obtenga la ubicación actual del usuario sin usar gps o internet
obtener ubicacion android studio 2018 (7)
¿Has echado un vistazo a Google Maps Geolocation Api? Geolocalización de Google Map
Esto es simple RestApi, solo necesita una solicitud POST, el servicio devolverá una ubicación con precisión en metros
Cordial saludo
¿Es posible obtener la ubicación actual del usuario sin usar gps
o internet
? Me refiero con la ayuda del proveedor de red móvil. ¿Alguien puede ayudarme?
Al obtener getLastKnownLocation
, en realidad no inicia una reparación usted mismo.
Tenga en cuenta que esto podría iniciar el proveedor, pero si el usuario alguna vez ha obtenido una ubicación, no creo que lo haga. Los documentos no son muy claros en esto.
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 determinado. 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 a AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
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"
Lo que está buscando hacer es obtener el puesto usando LocationManager.NETWORK_PROVIDER
lugar de LocationManager.GPS_PROVIDER
. El NETWORK_PROVIDER
se resolverá en el GSM o wifi, que siempre está disponible. Obviamente, con wifi apagado, se usará GSM. Tenga en cuenta que el uso de la red de telefonía es básicamente de 500 m.
http://developer.android.com/guide/topics/location/obtaining-user-location.html tiene información muy buena y código de muestra.
Después de terminar con la mayoría del código en 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 podría hacer que su actividad implemente la clase LocationListener
y así implementar onLocationChanged()
en su actividad.
No, actualmente no se puede obtener la ubicación sin usar GPS o internet.
Las técnicas de ubicación basadas en Wi-Fi, Celular o Bluetooth funcionan con la ayuda de una gran base de datos que se actualiza constantemente. Un dispositivo escanea las identificaciones del transmisor y luego las 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 previas 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 servicios móviles solo podría proporcionar servicios de datos locales pero no tiene acceso a Internet, y luego responder consultas de ubicación desde dispositivos móviles. Los proveedores de servicios móviles no hacen esto; nadie quiere pagar por este tipo de acceso a datos restringidos. Si tiene servicio de datos a través de su proveedor de telefonía móvil, entonces tiene acceso a Internet.
En resumen, utilizar LocationManager.NETWORK_PROVIDER o android.hardware.location.network para obtener la ubicación requiere el uso de Internet.
Usar la última posición conocida requiere que haya tenido acceso a GPS o a Internet recientemente. Si acaba de usar Internet, es probable que pueda ajustar su posición o configuración para volver a conectarse a Internet. Si su dispositivo no tiene GPS o acceso a Internet, la última función de posición conocida no lo ayudará.
Sin GPS o internet, podrías:
- Tome fotografías del cielo nocturno y use la hora actual para estimar su ubicación según un gráfico estelar. Esto probablemente requerirá equipo adicional para garantizar que los ángulos de sus imágenes se midan correctamente.
- Utiliza un acelerómetro para rastrear la ubicación desde 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.
Parece que es posible rastrear un teléfono inteligente sin usar el GPS.
FWIW.
Fuentes:
Principal: "PinMe: seguimiento de un usuario de teléfonos inteligentes en todo el mundo"
Secundario: "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.
Te estaré viendo.
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;
}
}