Usa la API de Tasks en Android

Advertencia: Este documento es obsoleto. Si quieres obtener información para autorizar apps para Android con OAuth 2.0, consulta la documentación de autorización de Servicios de Play para Android.

En este documento, se explica cómo usar la API de Tasks con OAuth 2.0 en Android. Se describen los mecanismos de autorización para obtener acceso a las tareas de Google Tasks de un usuario y cómo puedes tener un objeto de servicio de la API de Tasks listo para usar en tu aplicación para Android.

Para que tu aplicación para Android use la API de Tasks, debes realizar los siguientes pasos:

  1. Selecciona la Cuenta de Google del usuario
  2. Obtener un token de acceso de OAuth 2.0 desde AccountManager para la API de Tasks
  3. Identifica tu proyecto y configura el objeto de servicio de Tasks
  4. Cómo realizar llamadas a la API de Tasks

Importa la biblioteca cliente de Google

Los ejemplos que encontrarás en este documento usan la biblioteca cliente de las APIs de Google para Java. Deberás agregar los siguientes archivos jar a tu aplicación para Android. Para ello, coloca los que se indican a continuación en la carpeta /assets en la raíz de tu aplicación para Android. También comprueba si hay nuevas versiones a medida que este documento se vuelva antiguo.

Importa los archivos jar de la biblioteca cliente de las API de Google y sus extensiones de Android (todas parte de google-api-java-client-1.4.1-beta.zip):

  • google-api-client-1.4.1-beta.jar
  • google-api-client-extensions-android2-1.4.1-beta.jar
  • google-api-client-googleapis-1.4.1-beta.jar
  • google-api-client-googleapis-extensions-android2-1.4.1-beta.jar

Importa el archivo jar específico de Tasks:

Importa dependencias (todas parte de google-api-java-client-1.4.1-beta.zip):

  • commons-codec-1.3.jar
  • gson-1.6.jar
  • guava-r09.jar
  • httpclient-4.0.3.jar
  • httpcore-4.0.1.jar
  • jackson-core-asl-1.6.7.jar
  • jsr305-1.3.9.jar

Cuentas de Google en Android

A partir de Android 2.0, el AccountManager administra las cuentas que registraste en tu entorno, las que se indican en Configuración > Cuentas y sincronización. Específicamente, controla el flujo de autorización y puede generar tokens de autorización que son necesarios para acceder a los datos mediante APIs.

Cuentas registradas en tu entorno de Android
Cuentas registradas en tu entorno de Android

Para poder usar AccountManager para obtener cuentas y solicitar tokens de autorización, debes agregar los siguientes permisos en el manifiesto de tu aplicación para Android:

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />

Puedes usar el AccountManager para obtener la Cuenta de Google a la que quieres acceder a Tasks. El AccountManager no solo administra las cuentas de Google, sino también las de otros proveedores. Por lo tanto, tendrás que solicitar específicamente Cuentas de Google con el siguiente código:

AccountManager accountManager = AccountManager.get(activity);
Account[] accounts = accountManager.getAccountsByType("com.google");

Como alternativa, la biblioteca cliente de las APIs de Google para Java incluye un GoogleAccountManager que solo administra Cuentas de Google:

GoogleAccountManager googleAccountManager = new GoogleAccountManager(activity);
Account[] accounts = googleAccountManager.getAccounts();

Si hay más de una cuenta de Google disponibles en el dispositivo Android, debes solicitar al usuario la cuenta que desea usar con un cuadro de diálogo que podría verse así:

Cuadro de diálogo Elegir una cuenta
Cuadro de diálogo Elegir una cuenta

Puedes crear ese diálogo usando el siguiente código switch/case en el método onCreateDialog de tu actividad:

@Override
protected Dialog onCreateDialog(int id) {
  switch (id) {
    case DIALOG_ACCOUNTS:
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setTitle("Select a Google account");
      final Account[] accounts = accountManager.getAccountsByType("com.google");
      final int size = accounts.length;
      String[] names = new String[[]size];
      for (int i = 0; i < size; i++) {
        names[[]i] = accounts[[]i].name;
      }
      builder.setItems(names, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
          // Stuff to do when the account is selected by the user
          gotAccount(accounts[[]which]);
        }
      });
      return builder.create();
  }
  return null;
}

Si llamas a showDialog(DIALOG_ACCOUNTS), se mostrará el diálogo del selector de cuentas.

El flujo de autorización de las APIs de Google en Android

Ahora que el usuario eligió una cuenta, podemos pedirle a AccountManager que emita un token de acceso de OAuth 2.0 para la API Task. Para ello, se debe llamar al método AccountManager.getAuthToken(). Durante la llamada a AccountManager.getAuthToken(), AccountManager se encargará de comunicarse con el extremo de autorización de las APIs de Google. Cuando AccountManager haya recuperado el token de autorización, ejecutará el AccountManagerCallback que definiste en la llamada de método:

manager.getAuthToken(account, AUTH_TOKEN_TYPE, null, activity, new AccountManagerCallback<Bundle>() {
    public void run(AccountManagerFuture<Bundle> future) {
      try {
        // If the user has authorized your application to use the tasks API
        // a token is available.
        String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
        // Now you can use the Tasks API...
        useTasksAPI(token);
      } catch (OperationCanceledException e) {
        // TODO: The user has denied you access to the API, you should handle that
      } catch (Exception e) {
        handleException(e);
      }
    }
  }, null);

Como quizás ya sepas, AccountManager de Android tiene compatibilidad experimental con OAuth 2.0. Solo tienes que anteponer oauth2: al alcance de la API a la que deseas acceder cuando configures AUTH_TOKEN_TYPE. Para la API de Tasks, puedes usar lo siguiente:

String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks";

El problema cuando se usa el valor anterior como AUTH_TOKEN_TYPE es que la string oauth2:https://www.googleapis.com/auth/tasks se mostrará en el diálogo de autorización como el nombre del producto de Google al que deseas acceder. A fin de evitar esto, existen alias especiales AUTH_TOKEN_TYPE para la API de Tasks, legibles por humanos. Son equivalentes a usar el alcance de OAuth 2.0. Por ejemplo, puedes usar lo siguiente:

String AUTH_TOKEN_TYPE = "Manage your tasks";

También puedes usar el alias AUTH_TOKEN_TYPE View your tasks, que es equivalente al alcance de solo lectura de la API de Tasks: oauth2:https://www.googleapis.com/auth/tasks.readonly.

Durante la llamada a AccountManager.getAuthToken(), AccountManager verificará si tu aplicación tiene autorización para acceder a la API de Tasks. Si tu aplicación aún no se autorizó, AccountManager inicia una Activity, que muestra un diálogo de autorización al usuario para que pueda Permitir o Rechazar que tu aplicación use la API de Tasks en su cuenta.

Diálogo de autorización
Diálogo de autorización

Si el usuario rechaza que tu aplicación acceda a la API de Tasks, se generará una OperationCanceledException durante la llamada a future.getResult(). Debes manejar esta tarea correctamente, por ejemplo, pidiendo que vuelvas a elegir la cuenta o mostrando un mensaje con un botón para volver a autorizar el acceso.

Identifica tu aplicación y configura el objeto de servicio de la API de Tasks

Ahora que tu aplicación tiene autorización para acceder a la API de Tasks y que se le otorgó un token de acceso, también necesitas una clave de API que debes obtener de un proyecto en la Consola de APIs de Google, ya que es obligatoria para realizar llamadas a la API de Tasks. Para hacerlo, sigue estos pasos:

  1. Crea un proyecto o usa uno existente
  2. Para habilitar la API de Tasks en tu proyecto, cambia el interruptor de la API a ACTIVADO.
  3. Puedes encontrar la clave de API en Acceso a la API > Acceso a la API simple > Clave de API.

Cómo obtener la clave de API desde la Consola de APIs
Cómo obtener la clave de API desde la Consola de APIs

La clave de API es obligatoria, ya que identifica a tu aplicación y, por lo tanto, permite que la API deduzca la cuota y utilice las reglas de cuota definidas para el proyecto. Debes especificar la clave de API en tu objeto de servicio de Tasks:

useTasksAPI(String accessToken) {
  // Setting up the Tasks API Service
  HttpTransport transport = AndroidHttp.newCompatibleTransport();
  AccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(accessToken);
  Tasks service = new Tasks(transport, accessProtectedResource, new JacksonFactory());
  service.accessKey = INSERT_YOUR_API_KEY;
  service.setApplicationName("Google-TasksSample/1.0");

  // TODO: now use the service to query the Tasks API
}

El accessToken solo es válido por un período determinado, por lo que tendrás que obtener uno nuevo cuando venza. Existen 2 maneras de manejar esto:

  • Solicita un accessToken a AccountManager cada vez que realices solicitudes a través de la API. Dado que AccountManager almacena en caché el token, esta solución es aceptable.
  • Sigue usando accessToken hasta que aparezca un error 403. En ese momento, le solicitas un token nuevo a AccountManager.

Manipular tareas a través de la API

En este punto, deberías tener un objeto service de la API de Tasks completamente configurado que puedes usar para consultar la API según la Guía para desarrolladores de la API de Tasks, por ejemplo:

// Getting all the Task lists
List taskLists = service.tasklists.list().execute().items;

// Getting the list of tasks in the default task list
List tasks = service.tasks.list("@default").execute().items;

// Add a task to the default task list
Task task = new Task();
task.title = "New Task";
task.notes = "Please complete me";
task.due = "2010-10-15T12:00:00.000Z";
Task result = service.tasks.insert("@default", task).execute();

No olvides agregar el permiso de acceso a Internet al manifiesto de tu aplicación para Android. De lo contrario, las solicitudes anteriores a los extremos de la API de Tasks fallarán:

<uses-permission android:name="android.permission.INTERNET" />

Aplicación de ejemplo

Recientemente, agregamos un ejemplo nuevo al repositorio de muestra de la biblioteca cliente de las APIs de Google para Java con el fin de ayudarte a comenzar a usar la API de Tasks y OAuth 2.0 en Android. El ejemplo es una aplicación para Android simple pero completamente funcional que solicita autorización para usar la API de Tasks y mostrar las tareas de la lista predeterminada de tareas en una ListView.

Cómo mostrar las tareas en la lista de tareas predeterminadas en una ListView
Cómo mostrar las tareas en la lista de tareas predeterminadas en una ListView

Sigue estas instructions para ejecutar la muestra y no dudes en publicar tus comentarios o preguntas en el Foro de la API de Google Tasks.