Inicio Android Integración con Google+ (II): Datos de perfil y Círculos

Integración con Google+ (II): Datos de perfil y Círculos

por sgoliver

[box style=»full» type=»note»]ATENCIÓN: ARTÍCULO OBSOLETO

Puedes consultar información actualizada en el nuevo artículo sobre Google Sign-In.[/box]

En el artículo anterior de la serie vimos cómo podíamos incluir en nuestra aplicación la opción de que el usuario se pueda loguear utilizando su cuenta de Google a través de Google+. En este nuevo artículo veremos cómo acceder a la información del perfil del usuario y cómo recuperar la lista de sus contactos y la información sobre ellos.

Empecemos por el principio. Una vez el usuario está correctamente logueado en Google+ nuestra aplicación tendrá acceso a todos los datos públicos de su perfil. El acceso a estos datos se podrá realizar a través de la clase Person, que contiene los métodos necesarios para recuperar cada uno de los datos del perfil.

Para obtener una referencia a un objeto Person para el usuario logueado utilizaremos el método loadPerson() pasándole como segundo parámetro el ID del usuario si lo conocemos, o el valor especial «me«. Por su parte, el primer parámetro de loadPerson() debe ser una referencia a un objeto que implemente la interfaz PlusClient.OnPersonLoadedListener, que añade un único método (onPersonLoaded) que será llamado cuando se hayan recuperado los datos del usuario solicitado y pueda utilizarse su objeto Person asociado.

En nuestro caso de ejemplo haremos que sea nuestra actividad principal la que implemente dicha interfaz e implementaremos el método onPersonLoaded() como uno más de la actividad. Indicar aquí que para el ejemplo de este artículo partiremos del ya construido en el artículo anterior. Veamos entonces cómo accederíamos a los datos del usuario logueado:

public class MainActivity extends Activity
	implements ConnectionCallbacks, OnConnectionFailedListener,
		PlusClient.OnPersonLoadedListener
{
	@Override
	public void onConnected(Bundle connectionHint)
	{
		//...

		//Información del perfil del usuario logueado:
		plusClient.loadPerson(this, "me");
	}

	@Override
	public void onPersonLoaded(ConnectionResult status, Person person) {
	    if (status.getErrorCode() == ConnectionResult.SUCCESS)
	    {
	        txtInfo.setText(
	        	person.getId() + "\n" +
	        	person.getDisplayName() + "\n" +
	        	person.getPlacesLived().get(0).getValue() + "\n" +
	        	person.getOrganizations().get(1).getName() + "\n" +
	        	person.getUrls().get(0).getValue() + "\n" +
	        	plusClient.getAccountName()
	        );
	    }
	}

	//...
}

Como podemos ver, en el método onConnected() llamamos a loadPerson() para solicitar de forma asíncrona los datos del usuario «me«, es decir, el usuario actualmente loguado en la aplicación. Una vez estos datos estén disponible se ejecutará automáticamente el método onPersonLoaded(), en el que se recibe como parámetro el objeto Person que encapsula todos los datos del perfil público del usuario.

Para acceder a los datos a través del objeto Person tenemos disponibles multitud de métodos que podéis consultar en la documentación oficial de la clase. Yo, a modo de ejemplo, utilizo cinco de ellos y muestro el resultado en un simple cuadro de texto (txtInfo) que he añadido a la interfaz. En primero lugar recupero el ID del usuario con getId(), a continuación recupero el nombre mostrado en el perfil con getDisplayName(), después el lugar de residencia con getPlacesLived(), mi empresa actual con getOrganizations() y el primero de los enlaces públicos de mi perfil que corresponde a mi web utilizando getUrls().

Como podéis ver algunos de estos métodos devuelven listas de datos, como getPlacesLived() o getOrganizations(), a cuyos elementos accedemos mediante el método get(i) y obtenemos su valor con getName() o getValue() dependiendo de la entidad recuperada. Como ya he dicho, los datos disponibles son muchos y lo mejor es consultar la documentación oficial en cada caso.

Si volveis a mirar el código anterior, al final del todo recupero un dato más, en este caso utilizando directamente un método del cliente de Google+ en vez de la clase Person. Este método getAccountName() se utiliza para consultar la dirección de correo electrónico del usuario logueado, ya que aunque existe un método getEmails() en la clase Person, éste no devolverá la dirección principal del usuario a menos que éste la haya hecho pública en su perfil.

Si ejecutamos ahora la aplicación de ejemplo podréis ver los datos del perfil del usuario que hayáis utilizado para hacer login, en mi caso algo así:

info-usuario-1

Lo siguiente que vamos a recuperar son los contactos incluidos en los círculos del usuario. Recordad que tal como vimos en el artículo anterior la aplicación sólo tendrá acceso a los círculos a los que usuario haya dado permiso al loguarse en la aplicación. Otro detalle a tener en cuenta es que podremos acceder a los contactos pero no a los nombres de los círculos que los contienen.

Para recuperar los contactos incluidos en los círculos del usuario que son visibles para la aplicación utilizaremos el método loadPeople(). Este método nos devolverá un objeto PersonBuffer con todos los contactos de los círculos visibles. Al igual que pasaba con loadPerson(), esta carga la hará de forma asíncrona de forma que cuando haya finalizado se llamará automáticamente al método onPeopleLoaded() del objeto que le pasemos como parámetro, que debe implementar la interfaz PlusClient.OnPeopleLoadedListener. Para ello haremos lo mismo que antes, implementaremos dicha interfaz en nustra actividad principal.

public class MainActivity extends Activity
			implements ConnectionCallbacks, OnConnectionFailedListener,
				PlusClient.OnPersonLoadedListener, PlusClient.OnPeopleLoadedListener
{
	@Override
	public void onConnected(Bundle connectionHint)
	{
		//...

        	//Personas en mis círculos visibles para la aplicación:
        	plusClient.loadPeople(this, Person.Collection.VISIBLE);
	}

	@Override
	public void onPeopleLoaded(ConnectionResult status, PersonBuffer personBuffer, String nextPageToken) {
	    if (status.getErrorCode() == ConnectionResult.SUCCESS)
	    {
	        try
	        {
	            int count = personBuffer.getCount();
	            StringBuffer contactos = new StringBuffer("");

	            for (int i = 0; i < count; i++)
	            {
	            	contactos.append(
            			personBuffer.get(i).getId() + "|" +
            			personBuffer.get(i).getDisplayName() + "\n");
	            }

	            txtContactos.setText(contactos);
	        }
	        finally
	        {
	            personBuffer.close();
	        }
	    }
	}
}

Comentemos la implementación del método onPeopleLoaded(). Lo primero que hacemos es obtener el número de contactos recuperados llamando al método getCount() del PersonBuffer. Hecho esto recorremos la lista accediendo a cada contacto mediante el método get(i) que devuelve su objeto Person asociado. A partir de aquí ya podemos mostrar los datos necesarios de cada contacto utilizando los métodos de la clase Person que ya hemos comentado antes. Como ejemplo yo muestro el ID y el nombre de cada contacto en un cuadro de texto adicional que he añadido a la interfaz. Por último, pero no menos importante, debemos cerrar el objeto PersonBuffer mediante su métdo close() para liberar recursos.

Si volvemos a ejecutar ahora la aplicación obtendremos algo similar a lo siguiente:

info-usuario-2

Por último, comentar que ahora que tenemos los ID de cada contacto, si en algún momento necesitamos obtener los datos de su perfil podríamos utilizar el mismo método loadPerson() que hemos comentado antes pasándole su ID como segundo parámetro. Así, por ejemplo, si quisiera recuperar los datos del perfil de Roman Nurik realizaríamos la siguente llamada:

//Perfil de un contacto:
plusClient.loadPerson(this, "113735310430199015092");

Y hasta aquí este segundo artículo de la serie. En el próximo veremos cómo podemos publicar contenidos en Google+ desde nuestra aplicación.

Puedes consultar y/o descargar el código completo de los ejemplos desarrollados en este artículo accediendo a la pagina del curso en GitHub.

También te puede interesar

6 comentarios

Wilson 02/10/2013 - 16:30

Excelente, desde el título al último punto este curso no tiene desperdicio. muchas gracias

Responder
Juan carlos 27/10/2013 - 2:33

amigo no puedo utilizar PlusClient.OnPersonLoadedListener en mi proyecto me sale error :(

Responder
Pedro 07/01/2014 - 10:43

Hola! Excelente tutorial!

Creo que debes actualizar este articulo en particular porque PlusClient.OnPersonLoadedListener no existe más.

http://stackoverflow.com/questions/19087102/plusclient-onpersonloadedlistener-cannot-be-resolved-to-a-type

Gracias!

Responder
sgoliver 07/01/2014 - 10:55

Gracias por el aviso! Lo actualizo lo antes posible. Saludos.

Responder
semseoweb 24/06/2014 - 22:13

Muy completo el tutorial. Excelente app. Estaba buscando algún tuto sobre este tema y el tuyo es el más completo y conciso. Gracias por compartir

Responder
Andres 06/02/2015 - 19:25

Va a haber próximo artículo? Este artículo termina diciendo: «En el próximo veremos cómo podemos publicar contenidos en Google+ desde nuestra aplicación.»

Gracias!!! excelente tutorial. Todavía lo estoy estudiando

Responder

Dejar un comentario

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. Aceptar Más Información

Política de Privacidad y Cookies