Quiero crear una aplicación que se centre en obtener la ubicación actual del usuario y luego encontrar puntos de interés (como bares, restaurantes, etc.) que estén cerca de él a través de la API de Google Places .
Al buscar en la web un lugar para comenzar, me encontré con algunos tutoriales que usan la LocationManager
clase y otros que usan los Servicios de Google Play para encontrar la ubicación de los usuarios.
A primera vista, ambos hacen lo mismo, pero como soy nuevo en esto, me confundo un poco y no sé qué método se adapta mejor a mis necesidades. Entonces, quiero preguntarte:
¿Cuáles son las diferencias entre estos dos métodos para encontrar ubicaciones (si las hay)?
android
gps
geolocation
SoCo
fuente
fuente
Respuestas:
Ubicación del usuario en Android
Obtener la ubicación del usuario en Android es un poco menos sencillo que en iOS. Para comenzar la confusión, hay dos formas totalmente diferentes de hacerlo. El primero usa las API de Android
android.location.LocationListener
y el segundo usa las API de los servicios de Google Playcom.google.android.gms.location.LocationListener
. Veamos los dos.API de ubicación de Android
Las API de ubicación de Android utilizan tres proveedores diferentes para obtener la ubicación:
LocationManager.GPS_PROVIDER
- Este proveedor determina la ubicación mediante satélites. Dependiendo de las condiciones, este proveedor puede tardar un tiempo en devolver una corrección de ubicación.LocationManager.NETWORK_PROVIDER
- Este proveedor determina la ubicación según la disponibilidad de la torre celular y los puntos de acceso WiFi. Los resultados se recuperan mediante una búsqueda en la red.LocationManager.PASSIVE_PROVIDER
- Este proveedor devolverá ubicaciones generadas por otros proveedores. Recibirá actualizaciones de ubicación pasivamente cuando otras aplicaciones o servicios las soliciten sin solicitar las ubicaciones usted mismo.La esencia de esto es que obtienes un objeto del
LocationManager
sistema, implementasLocationListener
y llamasrequestLocationUpdates
alLocationManager
.Aquí hay un fragmento de código:
Guía de API de Google sobre estrategias de ubicaciónexplica el código bastante bien. Pero también mencionan que en la mayoría de los casos, obtendrá un mejor rendimiento de la batería, así como una precisión más adecuada, utilizando en su lugar la API de Google Location Services . ¡Ahora comienza la confusión!La API de servicios de ubicación de Google forma parte del APK de servicios de Google Play ( aquí se explica cómo configurarlo ). Están construidos sobre la API de Android. Estas API proporcionan un "Proveedor de ubicación fusionada" en lugar de los proveedores mencionados anteriormente. Este proveedor elige automáticamente qué proveedor subyacente usar, en función de la precisión, el uso de la batería, etc. Es rápido porque obtiene la ubicación de un servicio de todo el sistema que lo actualiza constantemente. Y puede usar funciones más avanzadas como geofencing.
Para usar los Servicios de ubicación de Google, su aplicación debe conectarse a
GooglePlayServicesClient
. Para conectarse con el cliente, su actividad (o fragmento, más o menos) necesita implementarseGooglePlayServicesClient.ConnectionCallbacks
eGooglePlayServicesClient.OnConnectionFailedListener
interfaces. Aquí hay un código de muestra:locationClient.getLastLocation()
nulo?El
locationClient.getLastLocation()
tiene la última ubicación conocida del cliente. Sin embargo, el proveedor de ubicación fusionada solo mantendrá la ubicación en segundo plano si al menos un cliente está conectado a ella. Una vez que se conecta el primer cliente, inmediatamente intentará obtener una ubicación. Si su actividad es el primer cliente en conectarse y usted llama degetLastLocation()
inmediatoonConnected()
, puede que no sea suficiente tiempo para que ingrese la primera ubicación. Esto resultará enlocation
sernull
.Para resolver este problema, debe esperar (indeterminadamente) hasta que el proveedor obtenga la ubicación y luego llamar
getLastLocation()
, lo que es imposible saber. Otra opción (mejor) es implementar lacom.google.android.gms.location.LocationListener
interfaz para recibir actualizaciones periódicas de ubicación (y apagarla una vez que obtenga la primera actualización).En este código, verifica si el cliente ya tiene la última ubicación (en
onConnected
). Si no, está solicitando actualizaciones de ubicación y desactivando las solicitudes (enonLocationChanged()
devolución de llamada) tan pronto como reciba una actualización.Tenga en cuenta que
locationClient.requestLocationUpdates(locationRequest, this);
debe estar dentro de laonConnected
devolución de llamada, de lo contrario, recibirá unIllegalStateException
mensaje porque intentará solicitar ubicaciones sin estar conectado al Cliente de servicios de Google Play.Muchas veces, el usuario deshabilitaría los servicios de ubicación (para ahorrar batería o razones de privacidad). En tal caso, el código anterior aún solicitará actualizaciones de ubicación, pero
onLocationChanged
nunca se le llamará. Puede detener las solicitudes comprobando si el usuario ha deshabilitado los servicios de ubicación.Si su aplicación requiere que habiliten los servicios de ubicación, querrá mostrar un mensaje o un brindis. Desafortunadamente, no hay forma de verificar si el usuario ha deshabilitado los servicios de ubicación en la API de servicios de ubicación de Google. Para esto, tendrá que recurrir a la API de Android.
En su
onCreate
método:Y usa la
locationEnabled
bandera en tuonConnected
método así:ACTUALIZAR
El documento se actualiza, se elimina LocationClient y la API admite habilitar el GPS con un clic desde el cuadro de diálogo:
Enlace https://developer.android.com/training/location/change-location-settings#prompt
Nuevo cliente de ubicación: FusedLocationProviderClient
Se recomienda pasar por https://developer.android.com/training/location antes de realizar cualquier tarea de ubicación.
fuente
SettingsApi.checkLocationSettings()
verificar si el usuario ha habilitado los Servicios de ubicación (consulte aquí: developers.google.com/android/reference/com/google/android/gms/… ).LocationManager
! ¿La API de ubicación fusionada funciona en dispositivos que no tienen servicios de Google Play?fun isLocationEnabled(context: Context): Boolean { val locationMode: Int try { locationMode = Settings.Secure.getInt( context.contentResolver, Settings.Secure.LOCATION_MODE ) } catch (e: SettingNotFoundException) { e.printStackTrace() return false } return locationMode != Settings.Secure.LOCATION_MODE_OFF }
En mi experiencia, "precisión más apropiada" no significa mejor de ninguna manera. A menos que me falte algo, si desea asegurarse de que se utiliza el GPS, LocationManager es el único camino a seguir. Rastreamos vehículos con nuestra aplicación y, de nuevo, a menos que me falte algo, los Servicios de Google Play proporcionan algunas ubicaciones muy inexactas con bastante frecuencia.
fuente
Debes usar la API de ubicación de Google Play Services en lugar de LocationManager. Según los documentos:
En cuanto a por qué cambiar, Google dice esto:
fuente
He estado usando la API de servicios de ubicación de Google durante bastante tiempo. Tiene ventajas, ya que encapsula la complejidad de tener varias fuentes para determinar posiciones. Sin embargo, encapsula demasiado , de modo que cuando obtienes una posición extraña, no tienes forma de determinar de dónde vino esa posición extraña.
En la vida real he aparecido varios valores extraños, a 10 kilómetros de distancia de la posición real. La única explicación es que estas locas locaciones provienen de errores en las bases de datos de Google Wi-Fi o NWK, errores que siempre estarán allí, ya que las topologías de red y Wi-Fi cambian todos los días. Pero desafortunadamente (y sorprendentemente) la API no le brinda información sobre cómo se derivó una posición individual.
Esto te deja con los problemas de tener que filtrar los valores anormales basados en la verificación de plausibilidad de velocidad, aceleración, demora, etc.
... o regrese a la buena API de framework y use solo GPS, que es lo que decidí hacer hasta que Google mejore la API fusionada.
fuente
La API de Google Location Services , parte de Google Play Services, proporciona un marco de trabajo de alto nivel más potente que maneja automáticamente los proveedores de ubicación , el movimiento del usuario y la precisión de la ubicación . También maneja la programación de actualizaciones de ubicación en función de los parámetros de consumo de energía que proporcione. En la mayoría de los casos, obtendrá un mejor rendimiento de la batería , así como una precisión más adecuada, mediante el uso de la API de servicios de ubicación.
Diffferences más detallada entre las dos API Google Play Service Location API y Android Marco Ubicación API se puede encontrar aquí
fuente
Sí, la API de servicios de ubicación de Google Play Services puede proporcionar información de ubicación muy engañosa. Los módems WiFi se mueven, los módems WiFi se actualizan con información de ubicación incorrecta (es decir, si la ubicación es falsificada por un dispositivo Android que actualiza la ubicación del módem WiFi) y hay una serie de otras circunstancias que pueden dar lugar a datos de ubicación incorrectos de la triangulación del módem WiFi. En todas nuestras aplicaciones donde la ubicación precisa es obligatoria, usamos solo GPS.
fuente
Diferencias entre las dos API API de ubicación del servicio de Google Play y la API de ubicación de Android Framework basadas en el servicio GPS
FusedLocationProviderClient
requestLocationUpdates()
método para recuperar la ubicación.locationRequest.setInterval(milliseconds)
ysetFastestInterval(milliseconds)
no se basa en el cambio de ubicación del usuarioLocationManager Api
La búsqueda de ubicación basada en el cambio de ubicación del usuario y los intervalos de tiempo
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, milliseconds, mindistance, Mylocationlistener)
El valor LatLng devuelto contiene 14 valores decimales (por ejemplo: 11.94574594963342 79.81166719458997) valores de ubicación precisos
fuente