manager - google api client location android
Android: LocationManager vs Google Play Services (8)
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, encontré algunos tutoriales que usan la clase
LocationManager
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)?
Gerente de locación
Como se indica en la
documentación oficial
, esta clase le permite utilizar los servicios para una ubicación, actualizar periódicamente la posición geográfica del dispositivo o enviar "Intención" a las aplicaciones, para decir que el dispositivo está cerca de la ubicación predeterminada.
La API requiere
ACCESS_COARSE_LOCATION
o
ACCESS_FINE_LOCATION
Servicios de API de ubicación de Google
Es completamente inconsistente con LocationManager, pero en cuanto al funcionamiento en tiempo real, existen algunas diferencias fundamentales.
Ventajas y desventajas
En cuanto a los servicios de API de ubicación de Google, si lo comparamos con LocationManager, notamos un aumento significativo en el rendimiento y la estabilidad durante el uso. Por ejemplo, hubo un problema común con LocationManager al recibir ubicaciones anteriores o actualizaciones de mapas, cuando los parámetros se habían establecido para el período mínimo de tiempo y distancia por el cual el dispositivo debe ser desplazado para actualizaciones posteriores; uno de los parámetros generalmente se ignoraba. En Google Location API Services, este problema no se encontró. Además, los servicios de ubicación de Google consumen menos polvo de batería.
Como resultado, los servicios API de ubicación de Google funcionaron mejor en todos los casos. Sin embargo, también hay algunas desventajas. Para usar los Servicios de ubicación, debe instalar los Servicios de Google Play.
Por lo tanto, en dispositivos con firmware habitual que no son compatibles con Google o en los que los Servicios de Google no están disponibles, la aplicación no funcionará. Este es un punto muy importante que debe tenerse en cuenta. La investigación en esta área descubrió el hecho de que la mayoría de los usuarios no tienen los servicios de Google Play. Por ejemplo, no están disponibles en China debido a la política nacional, y esta es una parte importante del mercado que no se puede ignorar. En este caso, es necesario recurrir a LocationManager.
Google Location API Services es la mejor solución para trabajar con mapas. Esta API le permite trabajar con las coordenadas más precisas y con gastos mínimos en términos de recursos móviles, siempre que el usuario haya instalado los Servicios de Google Play; de lo contrario, la única solución es LocationManager.
Lee más here
Debes usar la API de ubicación de Google Play Services en lugar de LocationManager. Según los documentos:
Las API de ubicación de los servicios de Google Play son preferibles a las API de ubicación del marco de Android (android.location) como una forma de agregar conocimiento de ubicación a su aplicación. Si actualmente está utilizando las API de ubicación del marco de Android, le recomendamos encarecidamente que cambie a las API de ubicación de los servicios de Google Play lo antes posible.
En cuanto a por qué cambiar, Google dice esto:
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 proporciona. 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.
Diferencias entre las dos API API de ubicación de servicio de Google Play y la API de ubicación de Android Framework basadas en el servicio GPS
FusedLocationProviderClient
- Para la primera búsqueda, la ubicación no debe ser nula (es decir: alguna otra aplicación necesita actualizar la ubicación de Lastknown en la base de datos de GoogleplayService. Si es nula, debe solucionarse)
-
Para la siguiente recuperación secuencial, utiliza el método
requestLocationUpdates()
para obtener la ubicación. -
La búsqueda de ubicación solo se basa en
locationRequest.setInterval(milliseconds)
ysetFastestInterval(milliseconds)
, no se basa en el cambio de ubicación del usuario - El valor LatLng devuelto contiene solo 7 valores decimales (por ejemplo: 11.9557996, 79.8234599), no tan precisos
- Recomendado, cuando el requisito de su aplicación tiene una distancia de ubicación actual insignificante (precisión de 50 a 100 metros)
- Efectivo en el uso de la batería.
LocationManager Api
- La búsqueda de ubicación del usuario se invoca mediante locationManager.requestLocationUpdates ()
-
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
- Recomendado para la aplicación basada en la ubicación, cuando necesita más precisión incluso en metros.
- El uso de la batería se basa en el intervalo de recuperación y la distancia de recuperación.
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.
He estado usando la API de Google Location Services durante bastante tiempo. Tiene ventajas, ya que encapsula la complejidad de tener varias fuentes para determinar las 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 le deja con los problemas de tener que filtrar los valores anormales basados en la verificación de plausibilidad de la velocidad, la aceleración, el rodamiento, etc.
... o regrese a la buena y antigua API de marco y use solo GPS, que es lo que decidí hacer hasta que Google mejore la API fusionada.
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.
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 es usar las API de Android de
android.location.LocationListener
, y el segundo es usar las API de Google Play Services
com.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á las ubicaciones generadas por otros proveedores. Recibirá pasivamente actualizaciones de ubicación cuando otras aplicaciones o servicios las soliciten sin solicitar las ubicaciones usted mismo.
-
La esencia de esto es que obtiene un objeto de
LocationManager
del sistema, implementa el
LocationListener
y llama a
requestLocationUpdates
en el
LocationManager
.
Aquí hay un fragmento de código:
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);
La Guía API de Google sobre estrategias de ubicación explica 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!
- API de servicios de ubicación de Google
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 necesita conectarse al Cliente
GooglePlayServicesClient
.
Para conectarse al cliente, su actividad (o fragmento, más o menos) necesita implementar las interfaces
GooglePlayServicesClient.ConnectionCallbacks
y
GooglePlayServicesClient.OnConnectionFailedListener
.
Aquí hay un código de muestra:
public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener {
LocationClient locationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
locationClient = new LocationClient(this, this, this);
}
@Override
public void onConnected(Bundle bundle) {
Location location = locationClient.getLastLocation() ;
Toast.makeText(this, "Connected to Google Play Services", Toast.LENGTH_SHORT).show();
}
@Override
public void onDisconnected() {
Toast.makeText(this, "Connected from Google Play Services.", Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
// code to handle failed connection
// this code can be found here — http://developer.android.com/training/location/retrieve-current.html
}
-
¿Por qué la
locationClient.getLastLocation()
nula?
locationClient.getLastLocation()
obtiene 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 que se conecta y llama a
getLastLocation()
inmediato en
onConnected()
, es posible que no haya tiempo suficiente para que
onConnected()
la primera ubicación. Esto hará que la
location
sea
null
.
Para resolver este problema, debe esperar (indeterminadamente) hasta que el proveedor obtenga la ubicación y luego llamar a
getLastLocation()
, que es imposible saber.
Otra opción (mejor) es implementar la interfaz
com.google.android.gms.location.LocationListener
para recibir actualizaciones periódicas de ubicación (y apagarla una vez que obtenga la primera actualización).
public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
// . . . . . . . . more stuff here
LocationRequest locationRequest;
LocationClient locationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
// . . . . other initialization code
locationClient = new LocationClient(this, this, this);
locationRequest = new LocationRequest();
// Use high accuracy
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
// Set the update interval to 5 seconds
locationRequest.setInterval(UPDATE_INTERVAL);
// Set the fastest update interval to 1 second
locationRequest.setFastestInterval(FASTEST_INTERVAL);
}
// . . . . . . . . other methods
@Override
public void onConnected(Bundle bundle) {
Location location = locationClient.getLastLocation();
if (location == null)
locationClient.requestLocationUpdates(locationRequest, this);
else
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
// . . . . . . . . other methods
@Override
public void onLocationChanged(Location location) {
locationClient.removeLocationUpdates(this);
// Use the location here!!!
}
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 (en la devolución de llamada
onLocationChanged()
) tan pronto como reciba una actualización.
Tenga en cuenta que
locationClient.requestLocationUpdates(locationRequest, this);
tiene que estar dentro de la
onConnected
llamada
onConnected
, de lo contrario, recibirá una
IllegalStateException
porque intentará solicitar ubicaciones sin estar conectado al Cliente de servicios de Google Play.
- El usuario ha deshabilitado los Servicios de ubicación
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 nunca se
onLocationChanged
a
onLocationChanged
.
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 método
onCreate
:
LocationManager manager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationEnabled = false;
Toast.makeText(getActivity(), "Enable location services for accurate data", Toast.LENGTH_SHORT).show();
}
else locationEnabled = true;
Y use el indicador
locationEnabled
en su método
onConnected
esta manera:
if (location != null) {
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
else if (location == null && locationEnabled) {
locationClient.requestLocationUpdates(locationRequest, this);
}
gracias a Rahul Jiresal
ACTUALIZAR
El documento se actualiza, se elimina LocationClient y la API admite habilitar GPS con un clic desde el cuadro de diálogo:
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
// All location settings are satisfied. The client can initialize
// location requests here.
// ...
}
});
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
if (e instanceof ResolvableApiException) {
// Location settings are not satisfied, but this can be fixed
// by showing the user a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(MainActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
// Ignore the error.
}
}
}
});
Enlace https://developer.android.com/training/location/change-location-settings#prompt
Nuevo cliente de ubicación: FusedLocationProviderClient
private FusedLocationProviderClient fusedLocationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}
Se recomienda pasar por https://developer.android.com/training/location antes de realizar cualquier tarea de ubicación.
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.
Aquí se pueden encontrar diferencias más detalladas entre las dos API API de ubicación del servicio de Google Play y la API de ubicación de Android Framework.