Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Servicios de Google Play: Usar la API Places

Spanish (Español) translation by Javier Salesi (you can also view the original English article)

En Marzo de 2015, Google lanzo la API Places para Android como parte de los Servicios de Google Play. Ésta API permite a desarrolladores accesar a una gran variedad de información de Google para proporcionar a usuarios una experiencia ajustada a su actual ubicación al usar los nombres e información de lugares, en lugar de un conjunto de coordenadas.

En éste tutorial, aprenderás cómo presentar a tus usuarios el componente Place Picker, usar la API Places para adivinar el lugar actual del usuario, buscar un lugar por su ID, y permitir al usuario escribir en un campo de texto para presentarle resultados predictivos.

1. Configurar

Si no tienes una API key pública de Android, necesitarás crear una clave Google API pública para aplicaciones Android. Puedes hacer ésto al visitar la Consola de Desarrolladores de Google. Las instrucciones para crear una key (clave) basada en tu certificado de firma y nombre del paquete están disponibles en la documentación de Google y están más allá del alcance de éste artículo.

Cuando has creado una clave, busca la API Places y establécela en habilitada. Algunas llamadas a la API Places son limitadas en cuantas peticiones pueden ser enviadas en un periodo de 24 horas. Al momento de escribir éste articulo, una cuenta sin un perfil de facturación puede enviar hasta 1,000 peticiones mientras que una cuenta con un perfil de facturación puede enviar 150,000 peticiones. Si requieres más, puedes enviar una petición para tener éste límite incrementado como se describe en la documentación de Límites de Uso.

Con la clave de la API lista para usarse, es momento de empezar a trabajar en el  proyecto del demo. Crea un proyecto en Android Studio y establece la versión mínima soportada del SDK a al menos 9. Éste es el requisito mínimo para usar los servicios de Play de Google.

Una vez que Android Studio ha creado el proyecto de plantilla Hello World, abre el archivo build.gradle y, bajo el nodo dependencies, agrega la dependencia requerida de Play Services 7.0. Ésta es la más reciente al momento de escribir éste artículo, pero puedes verificar la versión más reciente al checar la documentación de Google.

Luego, abre AndroidManifest.xml, agrega los permisos requeridos para el proyecto, y señala que la versión 2 de OpenGL es requerida para la aplicación.

Lo último que necesitarás para hacer en el manifiesto es agregar dos etiquetas <meta-data> para establecer la version gms y la clave API para la aplicación dentro de la etiqueta <application>.

Cuando termines con el manifiesto, estás listo para comenzar a escribir código. Como éste es un componente de Play Services, necesitarás inicializar tu GoogleApiClient y conectarlo/desconectarlo durante el ciclo de vida de tu Activity. Hacemos ésto en los métodos onCreate, onStart, y onStop de la clase Activity.

2. Usar el Widget Place Picker

El widget Place Picker es un componente de interfaz de usuario proporcionado por Play Services que permite al usuario ver un mapa de su área circundante. El componente incluye una lista de lugares cercanos que pueden ser utilizados por tu aplicación. Al usar éste componente, puedes seguir un diseño estándar con el que sabrán como interactuar tus usuarios mientras puedes ahorrar tiempo en el proceso de desarrollo.

Place Picker Widget

Para usar el Place Picker, necesitas crear un intent y escuchar el resultado de Activity para tomar el Place (lugar) seleccionado por el usuario. El siguiente método muestra cómo lanzarías ésta Activity.

El PlacePicker.IntentBuilder es utilizado para crear el Intent que será usado para lanzar el Place Picker. También tiene un método disponible, setLatLngBounds, que te permite colocar un límite geográfico desde una esquina suroeste hasta una esquina noreste para controlar el área de búsqueda.

El Intent puede ser construido usando el método build de PlacePicker.IntentBuilder y lanzado usando el método startActivityForResult de tu Activity. Deberías notar que usar el método build tiene la posibilidad de tirar una excepción GooglePlayServicesNotAvailableException o GooglePlayServicesNotAvailableException, así esas deberían ser checadas para usar un bloque estándar try/catch y manejarlas correctamente si ocurren.

Si el usuario selecciona una locación de la lista del place picker, ese objeto Place es empaquetado en un Intent y enviado de regreso a la Actividad que llama. Usando el método PlacePicker.getPlace, puedes extraer los datos Place del Intent retornado.

Una vez que el objeto Place es extraído, puede ser tratado como un objeto modelo para mostrar o usar dentro de tu aplicación.

The Places API In Action

3. Buscar el lugar actual del usuario

Otra interesante característica de la API Places es que puedes usarla para adivinar si el usuario está actualmente en un lugar listado. La API también proporcionará una probabilidad para que puedas tomar decisiones informadas sobre cómo debería interactuar tu aplicación con el usuario. Debería notarse que ésta es una de las características de la API que requiere una petición contra tus usos asignados.

Para detectar el lugar del usuario, necesitarás usar el método Places.PlacesDetectionApi.getCurrentPlace para crear un PendingIntent que retorna un objeto PlaceLikelihoodBuffer. Usando un ResultCallBack, puedes tomar el primero, y el más probable, lugar del buffer y usar ese en tu aplicación.

Si tu aplicación necesita más información, puedes extraer otros objetos PlaceLikelihood del buffer al iterar a través de él. La probabilidad que éste lugar esté donde esta el usuario actualmente ubicado es pasado en cada objeto PlaceLikeliood como un valor de punto flotante de 0.0 a 1.0, 1.0 siendo casi una coincidencia garantizada. No olvides llamar a release en el PlaeLikelihoodBuffer para evitar cualquier fuga de memoria.

Asking the Places API for the Likelihood of the Current Place

4. Prediciendo Lugares

El siguiente y más complejo tópico en este tutorial es predecir y mostrar lugares al usuario al ingresar una búsqueda. De nuevo, éste llamado a la API también cuenta para los límites de uso de la API. Sin embargo, es invaluable para hacer tu aplicación más utilizable.

Predicting Places

Para ésta porción del tutorial, usarás un AutoCompleteTextView y un adaptador personalizado en la aplicación para escribir el nombre de un lugar para pronosticar. Casi todo el trabajo se hace en el adaptador. Sin embargo, necesitaremos pasar una referencia al GoogleApiClient al adaptador para que accese a la API.

Ésto puede hacerse en el callback (devolución de llamada) estándar GoogleApiClient, onConnected, y podemos remover la instancia del cliente en onStop donde mAdapter es una instancia de nuestra clase personalizada Adapter, AutoCompleteAdapter.

Para desencadenar una llamada a API cuando el usuario escriba una nueva letra en el AutoCompleteTextView, necesitas sobreescribir el método getFilter del ArrayAdapter. Éste método es desencadenado cuando el usuario cambia el contenido de la view (vista) asociada con el adaptador. Te permite cambiar el contenido del adaptador del AutoCompleteTextView. En el siguiente ejemplo, constraints es el contenido de la vista.

El método displayPredictiveResults es dónde la interacción actual con la API ocurre. Hay diferentes objetos que pueden hacerse para personalizar tus predicciones.

El primero es un objeto LatLngBounds que crea una zona límitrofe cuadrada desde un punto suroeste hasta un punto noreste para localizar la solicitud. Si null es pasado en lugar de un objeto inicializado LatLngBounds, entonces ninguna restricción geográfica será colocada en la solicitud.

El segundo objeto que puedes crear para personalizar la solicitud es un filtro para la petición de la API. El filtro para la llamada Places AutoCompletePredictions es una lista de objetos Integer que representa diferentes tipos de filtros. En éste punto, sólamente un tipo de filtro puede aplicarse a una petición. Los valores aceptables pueden encontrarse en la documentación. Si la lista Integer esta vacía o null es pasado, entonces todos los tipos de resultado son retornados.

Una vez que estás listo para hacer la petición, puedes usar el método Places.GeoDataApi.getAutocompletePredictions para regresar un PendingIntent, que puede ser asociada con un ResultCallback para mostrar la información regresada.

Es importante notar que un objeto personalizado que representa los objetos AutoCompletePrediction del buffer es usado para guardar los datos en el ArrayAdapter. De otra manera un excepción IllegalArgumentsException sería lanzada tan pronto como sea lanzado el buffer, que es crucial para evitar una fuga de memoria.

El contenido en AutoCompleteAdapter es mostrado usando un layout (maquetado)android.R.layout.simple_list_item_1 y patrón estándar ViewHolder en getView.

Cuando se da click a un objeto de ésta lista, el ID del Place seleccionado es pasdo a onItemClickedListener y buscado para mostrar.

5. Buscar un Place por ID

La parte final de éste tutorial cubre buscar un objeto Place basado en su ID. Ésto funciona similarmente a llamadas a otras API creando un PendingIntent e interactuando con el buffer retornado para tomar el lugar. Como los otros objetos del buffer con los que has trabajado, el PlaceBuffer debe llamar release para evitar cualquier fuga de memoria.

Conclusión

La API Places es una herramienta poderosa para hacer que tus aplicaciones estén conscientes de la ubicación del usuario y así proporcionarle información contextual. En éste tutorial, has aprendido cómo usar el componente Place Picker, adivinar la ubicación del usuario, presentarle resultados predictivos cuando realiza una búsqueda, y encuentra un lugar basado en una ID dada. Además de los tópicos cubiertos aquí, es posible también enviar nuevos lugares a Google para ayudar a expandir la información a la que tiene acceso la API.

¡Sé el primero en conocer las nuevas traducciones–sigue @tutsplus_es en Twitter!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.