Advertencia: Este documento dejó de estar disponible. Si deseas obtener información para autorizar apps para Android con OAuth 2.0, consulta la documentación de autorización de los Servicios de Play para Android.
En este documento, se explica cómo usar la API de Tasks con OAuth 2.0 en Android. En él, se describen los mecanismos de autorización para obtener acceso a Google Tasks de un usuario y cómo puedes tener un objeto 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 seguir varios pasos:
- Selecciona la Cuenta de Google del usuario
- Obtén un token de acceso de OAuth 2.0 de AccountManager para la API de Task
- Identifica tu proyecto y configura el objeto de servicio de Tasks
- Realiza llamadas a la API de Tasks
Importa la biblioteca cliente de Google
En las muestras que encontrarás en este documento, se usa 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 a continuación en la carpeta /assets en la raíz de tu aplicación para Android. También busca versiones nuevas a medida que este documento se vuelve más antiguo.
Importa los archivos JAR de la biblioteca cliente de las APIs de Google y sus extensiones para Android (que forman 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 son 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
Desde Android 2.0, AccountManager administra las cuentas que registraste en tu entorno, las que aparecen en Configuración > Cuentas y sincronización. En particular, controla el flujo de autorización y puede generar tokens de autorización necesarios para acceder a los datos con APIs.

Para poder usar AccountManager y 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 a la que deseas acceder en Tasks. AccountManager no solo administra las Cuentas de Google, sino también las cuentas de otros proveedores. Por lo tanto, deberás solicitar específicamente las 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 controla las 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 desea usar con un diálogo que podría verse de la siguiente manera:

Para compilar un diálogo de este tipo, usa el siguiente código de interruptor/caso 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.
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, llama 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á 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 ya sabes, AccountManager de Android tiene compatibilidad experimental con OAuth 2.0. Solo debes anteponer el permiso de la API a la que deseas acceder con oauth2: cuando configures AUTH_TOKEN_TYPE. Por lo tanto, para la API de Tasks, puedes usar lo siguiente:
String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks";
El problema que se genera cuando se usa el valor anterior como AUTH_TOKEN_TYPE es que la cadena 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. Para solucionar este problema, existen alias especiales de AUTH_TOKEN_TYPE legibles por humanos para la API de Tasks. Son equivalentes al uso del permiso 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 equivale al permiso 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 está autorizada para acceder a la API de Tasks. Si tu aplicación aún no está autorizada, 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.

Si el usuario niega el acceso de tu aplicación a la API de Tasks, se arrojará una OperationCanceledException durante la llamada a future.getResult(). Debes controlar esta situación de forma elegante, por ejemplo, pidiéndole al usuario que 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 se le asignó 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 ello, sigue estos pasos:
- Crea un proyecto o usa uno existente
- Habilita la API de Tasks en tu proyecto. Para ello, cambia el interruptor de la API de Tasks a la posición ON.
- La clave de API se encuentra en Acceso a la API > Acceso simple a la API > Clave de API.

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 el objeto 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 durante un período determinado, por lo que deberás obtener uno nuevo cuando venza. Existen 2 maneras de hacerlo:
- 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 recibas un error 403. En ese momento, solicita un token nuevo a AccountManager.
Cómo 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 ListtaskLists = 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 una nueva muestra al repositorio de muestras de la biblioteca cliente de las APIs de Google para Java para 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 que funciona completamente, que solicita autorización para usar la API de Tasks y mostrar las tareas de la lista de tareas predeterminada 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.