androidObtener última localización en Android
En este tutorial verás como gestionar los permisos para las versiones Android 6.0 o superior.
Crearás tu primera aplicación en Android Studio que obtenga la última localización conocida del usuario y lo muestre por pantalla.
Aprenderás
- A crear tu primera aplicación en Android Studio
- Adicionar permiso de localización
- Usar el
GoogleApiClient
- Obtener la última localización conocida y colocarla en pantalla
Requisitos
Crear el proyecto
Crea un nuevo proyecto en Android Studio con el nombre "Mi punto en el mundo".
Uso el SDK mínimo recomendado:
Créala desde una activity vacía:
Y con los valores por defecto en los nombres de la activity principal:
Con base a este proyecto en blanco sigue los siguientes pasos.
Interfaz de usuario
Crea una interfaz sencilla que tenga 4 textos (TextView
en Android) y las colocaremos una debajo de otra gracias a un LinearLayout
con orientación vertical.
Ve a tu activity_main.xml
en tu proyecto y cambia el elemento raíz a LinearLayout
, Android Studio te ayudará a cambiarlo con las sugerencias que aparezcan.
Dentro del LinearLayout
borra lo que tenga, crea un TextView
con ancho y alto de acuerdo a su contenido, es decir wrap_content
.
Puedes centrar todo el contenido del LinearLayout
colocando android:gravity="center"
como atributo del mismo.
El código resultante en activity_main.xml
es:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context="tech.alvarez.mipuntoenelmundo.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/latitud" />
<TextView
android:id="@+id/latitudTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
tools:text="Aquí viene la latitud" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/longitud" />
<TextView
android:id="@+id/longitudTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
tools:text="Aquí viene la longitud" />
</LinearLayout>
Toma en cuenta que colocamos tools:text
por que son TextView
que cambiarán de texto cuando se ejecute la aplicación.
Referencias en Java
Si queremos modificar los valores de los TextView
desde código tenemos que referenciarlos en tu MainActivity.java
.
Para ello, ve a tu MainActivity.java
y declara las siguientes variables en la parte superior:
private TextView latitudTextView;
private TextView longitudTextView;
Si aparece un error, puedes presionar Alt-Enter
en el error y hacer caso a la sugerencia para que importe la clase TextView
automáticamente.
Luego en el método onCreate()
coloca lo siguiente:
latitudTextView = (TextView) findViewById(R.id.latitudTextView);
longitudTextView = (TextView) findViewById(R.id.longitudTextView);
Es decir obtenemos los TextView
por su identificador (id) desde tu diseño en XML.
Nuestra activity hasta el momento va quedando así:
Adicionar dependencia
Para que empieces a acceder a los servicios de localización debes colocar la siguiente dependencia con la versión deseada en el build.gradle
del módulo.
compile 'com.google.android.gms:play-services-location:8.4.0'
Una vez que lo coloques aparecerá una advertencia en la parte superior, en esa advertencia presiona Sync now.
Espera a que termine de configurarse, en la barra de estado sabrás cuando terminó.
El build.gradle
del módulo queda así:
Permisos
Ahora harás que tu aplicación tenga permiso para acceder a la ubicación del usuario. Para eso, es necesario colocar el permiso en AndroidManifest.xml
.
Los permisos que existen para obtener la localización son los siguientes:
- Poca precisión pero bajo consumo de batería.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- Precisión alta con un consumo mayor de batería.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Usa la segunda opción para tener una mayor precisión que luego se podrás configurar con diferentes características. El AndroidManifest.xml
queda así:
GoogleApiClient
El GoogleApiClient
es el intermediario entre los servicios de Google y tu aplicación. Es el que se encarga de conectarse con el servicio deseado, es este caso el servicio de localización.
Variable global
En nuestra MainActivity.java
colocaremos un GoogleApiClient
con el mismo nombre como variable global para que sea accedido desde cualquier parte de tu clase.
private GoogleApiClient googleApiClient;
Construcción
En el método onCreate()
coloca lo siguiente:
googleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
Con ese código estas creando un GoogleApiClient
que pueda usar los servicios de localización y que los métodos que gestionan su funcionamiento están en la misma clase, así como el método que se ejecuta si hay error.
Esto te dará errores, con ayuda de Android Studio vamos a solucionarlos, haz que tu cursos este en el error y presiona el atajo de teclado Alt-Enter
verás sugerencias de solución:
Selecciona la segunda opción, implementará lo que necesitas, además de que generará los métodos que necesitas y usaremos en el siguiente paso.
Volverá a aparecer un nuevo error, acércate al error y haz el mismo proceso.
Ciclo de vida
Hay que gestionar el ciclo de vida de nuestro GooogleApiClient
, es decir que se conecte a los servicios de Google cuando tengamos la pantalla de nuestra aplicación en frente y que se desconecte cuando ya no lo estemos.
Debajo del método onCreate()
coloca los siguiente métodos que hacen exactamente lo que dijimos.
Método onStart()
@Override
protected void onStart() {
super.onStart();
googleApiClient.connect();
}
Método onStop()
@Override
protected void onStop() {
super.onStop();
if (googleApiClient.isConnected()) {
googleApiClient.disconnect();
}
}
Con esto ya tienes tu GoogleApiClient
totalmente listo para empezar a pedirle la última ubicación conocida.
Localización
Lo primero que necesitamos es crear una variable que guarde la localización (el punto).
Cualquier ubicación en el planeta se puede representar en dos números, esos son la latitud y la longitud.
Android tiene una clase llamada Location
que representa justamente esos dos números y tiene sus métodos getLatitude()
y getLongitude()
para acceder a esos dos números respectivamente.
Variable global
Crea un variable global de tipo Location
de la siguiente manera:
private Location ultimaUbicacion;
Esa variable ultimaUbicacion
tendrá justamente como su nombre lo dice, la última ubicación.
Obtener ubicación
En el anterior paso se generó automáticamente el método onConnected
, como su nombre lo dice ahí ya estamos seguros de que todo esta bien, es decir podemos obtener la ubicación con el siguiente código:
ultimaUbicacion = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (ultimaUbicacion != null) {
latitudTextView.setText(String.valueOf(ultimaUbicacion.getLatitude()));
longitudTextView.setText(String.valueOf(ultimaUbicacion.getLongitude()));
}
El que hace el trabajo de obtener la última ubicación es el método getLastLocation
, si no existiera esta retorna null
es por eso que hacemos una pregunta para validarlo.
String.valueOf( )
solo sirve para convertir el double
a String
ya que el método setText
no acepta double
.
Notarás que parece un error en la línea que obtiene la localización pero que no impide la ejecución de la aplicación. Lo que pasa es que a partir de Android 6.0 (API 23) hay que gestionar los permisos de diferente manera. Si no hacemos nada funcionará incluso para Android 6.0 o superior pero tendremos que darle permisos manualmente caso contrario tendrás un "crash".
Ejecutar
Ya puedes ejecutar tu aplicación en tu emulador o dispositivo físico.
El emulador debe tener Google Play Services, una forma rápida de darse cuenta si tiene o no es verificar si el emulador tiene Google Maps.
Problemas
-
Si no aparece ningún número de tu ubicación en la aplicación, puedes probar acceder a una aplicación que obtiene la localización constantemente, por ejemplo GoogleMaps y luego vuelve a entrar a la aplicación, preferentemente luego de cerrarla.
-
Si la aplicación se "crashea" es por que tienes Android 6.0 o superior, en ese caso debemos gestionar los permisos de una forma diferente, no lo haremos aún en este tutorial, por lo pronto daremos permiso de forma manual a la aplicación en el siguiente paso.
Permiso manual
Para otorgar permisos manualmente debes ir a la aplicación de ajustes (configuraciones) de tu dispositivo o emulador, luego la sección de aplicaciones instaladas, buscar tu aplicación, luego a permisos y ahí cambiar el switch a habilitado para la localización:
Ahora puedes volver a la aplicación y esta ya no se cerrará. Para hacer que reconozca un último punto de ubicación puedes ir a Google Maps y volver a la aplicación, preferentemente luego de haberla cerrado.
Conclusiones
Felicidades, terminaste tu primera aplicación que obtiene la última ubicación conocida.
Los siguientes pasos a dar son:
- Gestionar los permisos para Android 6.0 o superior
- Obtener actualización de la ubicación cada cierto tiempo