Usa la API de Tasks en Android

Advertencia: Este documento dejó de estar disponible. Para obtener información sobre la autorización de aplicaciones para Android con OAuth 2.0, consulta la Documentación de Autorización de los Servicios de Android Play.

En este documento, se explica cómo usar la API de Tasks con OAuth 2.0 en Android. Aquí se describen los mecanismos de autorización para obtener acceso a Google Tasks de un usuario y cómo se puede tener un objeto del 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, se requieren varios pasos:

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

Importa la biblioteca cliente de Google

En los ejemplos que encontrarás en este documento, se utiliza 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 archivos jar que se indican más abajo 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 actualice.

Importa los archivos jar de la biblioteca cliente de las APIs de Google y sus extensiones para 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 las dependencias (todas las partes 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, AccountManager administra las cuentas que registraste en tu entorno, las que se enumeran en Configuración > Cuentas y y la sincronización de los datos. Específicamente, controla el flujo de autorización y puede generar tokens de autorización que son necesarios para acceder a los datos a través de APIs.

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

Si quieres 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 AccountManager para obtener la Cuenta de Google para la que quieres acceder a Tasks. AccountManager no solo administra cuentas de Google, sino también cuentas de otros proveedores. Por lo tanto, deberás solicitar específicamente las cuentas de Google con el código que aparece a continuación:

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

Como alternativa, la biblioteca cliente de las API de Google para Java viene con un GoogleAccountManager que solo maneja cuentas de Google:

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

Si hay más de una cuenta de Google disponible en el dispositivo Android, debes solicitarle al usuario la cuenta que desee usar con un diálogo que podría verse de la siguiente manera:

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

Puedes crear un diálogo de este tipo usando el siguiente código de sentencia 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 de 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 API de Google. Cuando AccountManager recupere el token de autorización, ejecutará la AccountManagerCallback que definiste en la llamada al 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 ofrece compatibilidad experimental con OAuth 2.0. Cuando configures AUTH_TOKEN_TYPE, solo debes anteponer oauth2: al alcance de la API a la que deseas acceder. Entonces, para la API de Tasks, puedes usar lo siguiente:

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

Cuando se usa el valor anterior como AUTH_TOKEN_TYPE, el problema es que se mostrará la cadena oauth2:https://www.googleapis.com/auth/tasks en el diálogo de autorización como el nombre del producto de Google al que deseas acceder. Para solucionar este problema, existen alias AUTH_TOKEN_TYPE especiales y legibles por humanos para la API de Tasks. 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 Ver tus tareas, que equivale al acceso de solo lectura de la API de Tasks alcance: 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 está autorizada, el AccountManager iniciará una actividad, que mostrará 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.

Cuadro de diálogo de autorización
Cuadro de diálogo de autorización

Si el usuario rechaza el acceso de tu aplicación a la API de Tasks, se arrojará una OperationCanceledException durante la llamada future.getResult(). Debes controlar eso correctamente, por ejemplo, solicitando que se vuelva 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, activa el interruptor de la API de Tasks
  3. La clave de API se puede encontrar en Acceso a la API > Acceso simple a la API > 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 tu aplicación y, por lo tanto, permite que la API deduzca la cuota y use las reglas de cuota definidas para tu proyecto. Debes especificar la clave de API en tu objeto del 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 deberás 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 tu accessToken hasta que aparezca el error 403 y, en ese momento, solicitas un token nuevo para AccountManager.

Manipular tareas con 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 para acceder a Internet al manifiesto de tu aplicación para Android. De lo contrario, fallarán las solicitudes anteriores a los extremos de la API de Tasks:

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

Aplicación de ejemplo

Recientemente, agregamos un nuevo ejemplo al repositorio de muestra de la biblioteca cliente de las APIs de Google para Java para ayudarte a comenzar con la API de Tasks y OAuth 2.0 en Android. El ejemplo es una aplicación para Android simple, pero totalmente funcional, que solicita autorización para usar la API de Tasks y mostrar las tareas de la lista de tareas predeterminada 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 instrucciones para ejecutar la muestra y no dudes en publicar tus comentarios o preguntas en el Foro de la API de Google Tasks.