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

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?

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:

  1. 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 android google-play-services_lib en su proyecto de desarrollo como proyecto de biblioteca.
  2. 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

  1. 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.
  2. 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:

  1. 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"/> 
  2. 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
  3. Conéctese a Google Play Services, conectando LocationClient a la API de Google. Para ello, cree un objeto LocationClient (instancia de GoogleApiClient ) como:

     mLocationClient = new GoogleApiClient.Builder(getApplicationContext()) .addApi(LocationServices.API).addConnectionCallbacks(this) .addOnConnectionFailedListener(this).build(); 

    A continuación, llame a mLocationClient.connect(); .

  4. Cree una instancia de FusedLocationProviderApi utilizando la clase LocationServices como:

     private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi; 
  5. 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()); } 
  6. 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); } 
  7. 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

  • ¿Cómo se mide la exactitud de ubicación en Android?
  • Cómo simular la conducción de una ruta en el dispositivo real
  • Obtener la lista de lugares que rodean la ubicación actual del usuario
  • ¿Cómo funciona? RequestLocationUpdates () + LocationRequest / Listener
  • Descubra la velocidad del usuario en android Utilizando GPS
  • Utilizar GPS y proveedor de red al mismo tiempo en Android
  • ¿Cómo burlar la ubicación durante una presentación en un dispositivo real?
  • ¿Es posible saber mi ubicación vino de gps o glonass?
  • ¿Existe una manera de obtener la ubicación de "inicio" y "trabajo" del usuario a través de una API de Google?
  • Android - Obtener ubicación sólo una vez
  • ¿En qué país se encuentra actualmente el usuario?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.