Hacer que el proveedor de ubicación fusionado LocationClient sea más fácil de usar
Digamos que tengo 5 actividades diferentes en mi aplicación que desean usar LocationClient.getLastLocation()
para obtener la última ubicación conocida. Esto parece simple.
Lo ideal sería crear un LocationClient en cada actividad y llamar a getLastLocation (). Sin embargo, hay un trabajo adicional que uno tiene que hacer para conectarse a los Servicios de Google Play, como llamar a LocationClient.connect()
y manejar las devoluciones de llamada onConnected
, onDisconnected
y onConnectionFailed
. La documentación está aquí: https://developer.android.com/training/location/retrieve-current.html
- Android LocationListener Cambio de GPS a la red
- Android Cómo centrarse en la posición actual
- Cambiar la ubicación de descarga predeterminada
- Obtener la ubicación actual nombre de la ciudad, android
- encontrar la farmacia más cercana en google maps
Por lo que puedo decir, cada una de mis cinco actividades diferentes deben manejar todos los métodos del ciclo de vida del LocationClient. También no pueden llamar a getLastLocation()
inmediatamente en onCreate()
porque la conexión para esa actividad puede no haber sido establecida aún.
¿Hay una manera fácil de simplificar el ciclo de vida de LocationClient para que getLastLocation()
funcione de inmediato en cualquier actividad nueva una vez que obtengo la conexión establecida una vez para mi aplicación?
- Cómo comprobar si las coordenadas de una ubicación caen a otra ubicación coordenadas de radio en android
- ¿Cómo encontrar la ubicación del usuario usando la torre celular?
- Cómo configurar "Tipos" en Google Place PlacePicker en Android?
- Por qué getSpeed () siempre devuelve 0 en android
- Ubicación de Google Play No conectado. Llame a connect () y espere a que onConnected () se llame
- Criterios de LocationManager de Android
- OnConnected () no se llama para obtener actualizaciones de ubicación (GooglePlayApi para la ubicación)
- Android: el mejor método para calcular la distancia entre dos ubicaciones
He utilizado las API del proveedor de ubicaciones fusionadas para obtener actualizaciones de ubicación periódicas. Lo he implementado dentro de un servicio de fondo (por ejemplo, LocationUpdateService extends Service
). Anteriormente estaba usando API de marco de ubicación de Android, pero no es bueno para el uso de la batería. Las API de proveedor de ubicación fusionada son las mejores para un uso eficiente de la batería.
También he preparado unas notas de pasos que son necesarios para implementarlo (junto con otra información útil). En palabras sencillas, es la mejor manera de obtener datos de ubicación en la plataforma Android desde ahora. Los Servicios de Google Play proporcionan muchas API de ubicación para obtener los datos de ubicación (por ejemplo, la ubicación actual del usuario o la última ubicación conocida del dispositivo).
El proveedor de ubicación fusionada es una de las API de ubicación de los servicios de Google Play. Estos son los prerrequisitos:
-
El SDK de servicios de Google Play se utiliza como proyecto de biblioteca (y Google PlayService está instalado correctamente en tu dispositivo).
- Descargue e instale el componente de servicios de Google Play desde el Administrador de SDK y agregue la biblioteca a su proyecto.
- Importe la biblioteca
GooglePlayServices
desde androidgoogle-play-services_lib
en su proyecto de desarrollo como proyecto de biblioteca.
-
Debe tener un dispositivo real ya que esta API no funcionará en el emulador.
El proveedor de ubicación fusionada gestiona de forma inteligente la tecnología de ubicación subyacente (conexión GPS / Wi-Fi / proveedor de red) y nos proporciona la mejor ubicación según nuestras necesidades.
Por qué usarlo
Podríamos elegir uno de los proveedores de ubicación (red o GPS) y solicitar actualizaciones de ubicación o configurar alertas de proximidad. Pero hubo dos problemas principales con este enfoque: 1. En caso de que necesitamos definir la ubicación precisa, tuvimos que cambiar entre la red y los proveedores de ubicación GPS (como GPS no funciona en interiores). 2. Las alertas de proximidad se utilizaron para notificar a un usuario sobre la proximidad a una ubicación, y esto tomó su peaje en la vida de la batería.
Beneficios
- Simple APIs: Nos permite especificar necesidades de alto nivel como "alta precisión" o "baja potencia", en lugar de tener que preocuparse por los proveedores de ubicación.
- Batería eficiente: minimiza el uso de la energía de la aplicación. Basado en todas las solicitudes de ubicación entrantes y sensores disponibles, el proveedor de ubicación fusionado elige la forma más eficiente de satisfacer esas necesidades.
Pasos para utilizar esta API:
-
Declare el permiso relacionado con la ubicación en el archivo de manifiesto.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
O
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-
Implementar interfaces y devoluciones de llamada relacionadas. Antes de solicitar actualizaciones de ubicación, primero debemos implementar las interfaces que utiliza Servicios de ubicación para comunicar el estado de la conexión a nuestra aplicación:
-
com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks
: Especifica los métodos que llama a Servicios de ubicación cuando se conecta o desconecta un cliente de ubicación. -
com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener
-
-
Conéctese a Google Play Services, conectando
LocationClient
a la API de Google. Para ello, cree un objetoLocationClient
(instancia deGoogleApiClient
) como:mLocationClient = new GoogleApiClient.Builder(getApplicationContext()) .addApi(LocationServices.API).addConnectionCallbacks(this) .addOnConnectionFailedListener(this).build();
A continuación, llame a
mLocationClient.connect();
. -
Cree una instancia de
FusedLocationProviderApi
utilizando la claseLocationServices
como:private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;
-
Recuperar la ubicación actual dentro de
onConnected(Bundle bundle)
:Location currentLocation = fusedLocationProviderApi .getLastLocation(mLocationClient); if (mCurrentLocation != null) { Log.d(TAG, "last location = " + mCurrentLocation.getLatitude() + " - " + mCurrentLocation.getLongitude()); }
-
Crear y configurar un objeto
LocationRequest
:mLocationRequest = new LocationRequest(); private void setLocationParameter() { // Set the update interval mLocationRequest.setInterval(Constants.SECONDS_TO_UP); // Use high accuracy mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // Set the interval ceiling to one minute mLocationRequest.setFastestInterval(Constants.SECONDS_TO_UP); // Set the distance to 10 meters. mLocationRequest.setSmallestDisplacement(Constants.METERS_TO_UP); }
-
Para obtener actualizaciones periódicas de ubicación de Servicios de ubicación, enviamos una solicitud utilizando un cliente de ubicación.
LocationListener listener = new LocationListener() { @Override public void onLocationChanged(Location location) { Utils.locationUpdates = Utils.locationUpdates + 1; if (Utils.locationUpdates == 1) { mLocationRequest .setPriority(LocationRequest.PRIORITY_LOW_POWER); LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, mLocationRequest, listener); } } };
Puede crear una actividad base que implementa todos estos métodos y, a continuación, todas sus actividades solo tendrán que extenderse.
Para comprobar la referencia: android cómo crear mi propia actividad y ampliarla?
Puede crear un servicio para manejar el proveedor de ubicación fusionado en segundo plano y transmitir la ubicación y el estado a su actividad. Consulte el enlace https://gist.github.com/blackcj/20efe2ac885c7297a676
- ¿Es posible mostrar la barra de progreso cuando se descarga a través de Retrofit 2 Asynchronous?
- Google Analytics: lista los valores de eventos por etiqueta de evento