Utilizzare l'API Tasks su Android

Avviso: questo documento è obsoleto. Per informazioni su come autorizzare le app per Android utilizzando OAuth 2.0, consulta le Documentazione relativa all'autorizzazione di Android Play Services.

Questo documento spiega come utilizzare l'API Tasks con OAuth 2.0 su Android. Descrive i meccanismi di autorizzazione per ottenere l'accesso a Google Tasks di un utente e come creare un oggetto servizio dell'API Tasks pronto per l'uso nella tua applicazione Android.

Affinché la tua applicazione Android possa utilizzare l'API Tasks sono necessari diversi passaggi:

  1. Seleziona l'Account Google dell'utente
  2. Ottenere un token di accesso OAuth 2.0 da AccountManager per l'API Tasks
  3. Identifica il progetto e configura l'oggetto di servizio Tasks
  4. Effettuare chiamate all'API Tasks

Importazione della libreria client di Google in corso...

Gli esempi presenti in questo documento utilizzano la libreria client delle API di Google per Java. Dovrai aggiungere i seguenti jar alla tua applicazione Android. Per farlo, posiziona i jar elencati di seguito nella cartella /assets nella directory principale della tua applicazione Android. Verifica anche la presenza di nuove versioni man mano che questo documento diventa più vecchio.

Importa i jar della libreria client delle API di Google e le relative estensioni Android (tutte incluse in 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 il jar specifico di Tasks:

Importa le dipendenze (tutte parte di 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

Account Google in Android

A partire da Android 2.0, l'AccountManager gestisce gli account registrati nel tuo ambiente, ovvero quelli elencati in Impostazioni > Account e sincronizzati. Nello specifico, gestisce il flusso di autorizzazione e può generare i token di autorizzazione necessari per accedere ai dati utilizzando le API.

Account registrati nel tuo ambiente Android
Account registrati nel tuo ambiente Android

Per poter usare AccountManager per recuperare account e richiedere token di autorizzazione, devi aggiungere le seguenti autorizzazioni nel file manifest dell'applicazione Android:

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

Puoi utilizzare AccountManager per recuperare l'Account Google per cui vuoi accedere a Tasks. L'AccountManager non gestisce solo gli Account Google, ma anche gli account di altri fornitori. Pertanto, dovrai richiedere in modo specifico gli Account Google utilizzando il codice riportato di seguito:

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

In alternativa, la libreria client delle API di Google per Java include un GoogleAccountManager che gestisce solo gli Account Google:

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

Se sul dispositivo Android sono disponibili più Account Google, dovresti chiedere all'utente l'account che vuole utilizzare con una finestra di dialogo che potrebbe avere il seguente aspetto:

Finestra di dialogo Scegli account
Finestra di dialogo Scegli account

Puoi creare una finestra di dialogo di questo tipo utilizzando il seguente codice di commutazione/richiesta nel metodo onCreateDialog della tua attività:

@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;
}

Se chiami showDialog(DIALOG_ACCOUNTS), verrà visualizzata la finestra di dialogo del selettore account.

Flusso di autorizzazione delle API di Google su Android

Ora che l'utente ha scelto un account, possiamo chiedere all'AccountManager di emettere un token di accesso OAuth 2.0 per l'API Tasks. Per farlo, occorre richiamare il metodo AccountManager.getAuthToken(). Durante la chiamata AccountManager.getAuthToken(), AccountManager si occuperà di contattare l'endpoint di autorizzazione delle API di Google. Una volta recuperato il token di autorizzazione, l'AccountManager eseguirà l'elemento AccountManagerCallback che hai definito nella chiamata di metodo:

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);

Come Forse già sapete, l'AccountManager Android dispone del supporto sperimentale per OAuth 2.0. Quando imposti AUTH_TOKEN_TYPE, devi solo specificare il prefisso dell'ambito dell'API a cui vuoi accedere con oauth2:. Quindi, per l'API Tasks puoi utilizzare:

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

Il problema quando utilizzi il valore riportato sopra come AUTH_TOKEN_TYPE è che la stringa oauth2:https://www.googleapis.com/auth/tasks verrà visualizzata nella finestra di dialogo di autorizzazione come nome del prodotto Google a cui vuoi accedere. Per ovviare a questo problema, esistono speciali alias AUTH_TOKEN_TYPE leggibili per l'API Tasks. Equivale all'utilizzo dell'ambito OAuth 2.0. Ad esempio, puoi utilizzare:

String AUTH_TOKEN_TYPE = "Manage your tasks";

Puoi anche utilizzare l'alias AUTH_TOKEN_TYPE Visualizza le tue attività, equivalente all'API Tasks di sola lettura ambito: oauth2:https://www.googleapis.com/auth/tasks.readonly.

Durante la chiamata AccountManager.getAuthToken(), AccountManager controllerà se la tua applicazione è stata autorizzata ad accedere all'API Tasks. Se la tua applicazione non è ancora stata autorizzata, AccountManager avvia un'attività, che mostra una finestra di dialogo di autorizzazione all'utente in modo che l'utente possa consentire o negare all'applicazione di utilizzare l'API Tasks nel proprio account.

Finestra Autorizzazione
Finestra Autorizzazione

Se l'utente nega l'accesso della tua applicazione all'API Tasks, durante la chiamata future.getResult() verrà generata un'OperationCanceledException. Dovresti gestire questa situazione con grazia, ad esempio chiedendo di scegliere di nuovo l'account o visualizzando un messaggio con un pulsante per autorizzare nuovamente l'accesso.

Identificazione dell'applicazione e configurazione dell'oggetto del servizio API Tasks

Ora che la tua applicazione è autorizzata ad accedere all'API Tasks e le è stato assegnato un token di accesso, ti serve anche una chiave API che devi recuperare da un progetto nella console API di Google in quanto è obbligatoria per effettuare chiamate all'API Tasks. Per farlo, segui questi passaggi:

  1. Crea un progetto o utilizzane uno esistente
  2. Abilita l'API Tasks nel tuo progetto impostando l'opzione dell'API Tasks su ON
  3. La chiave API è disponibile in Accesso API > Accesso semplice all'API > Chiave API

Ottenere la chiave API dalla console API
Ottenere la chiave API dalla console API

La chiave API è obbligatoria in quanto identifica l'applicazione e consente quindi all'API di dedurre la quota e utilizzare le regole definite per il tuo progetto. Devi specificare la chiave API sull'oggetto servizio 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
}

accessToken è valido solo per un determinato periodo di tempo, quindi dovrai riceverne uno nuovo alla scadenza. Puoi farlo in due modi:

  • Richiedi un accessToken all'AccountManager ogni volta che effettui richieste tramite l'API. Poiché AccountManager memorizza nella cache il token, questa soluzione è accettabile.
  • Continua a utilizzare il tuo accessToken finché non ricevi un errore 403, quando richiedi un nuovo token per AccountManager.

Manipolare le attività tramite l'API

A questo punto, dovresti avere un oggetto del servizio dell'API Tasks completamente configurato, che puoi utilizzare per eseguire query sull'API in base alla Guida per gli sviluppatori dell'API Tasks, ad esempio:

// 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();

Non dimenticare di aggiungere l'autorizzazione per accedere a internet al file manifest dell'applicazione Android, altrimenti le richieste precedenti agli endpoint dell'API Tasks non andranno a buon fine:

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

Applicazione di esempio

Di recente abbiamo aggiunto un nuovo esempio al repository di esempio delle API di Google per Java per aiutarti a iniziare a utilizzare l'API Tasks e OAuth 2.0 su Android. L'esempio è un'applicazione Android semplice ma completamente funzionante che richiede l'autorizzazione per utilizzare l'API Tasks e visualizzare le attività dell'elenco di attività predefinite in un ListView.

Visualizzazione delle attività nell&#39;elenco di attività predefinite in una ListView
Visualizzazione delle attività nell'elenco di attività predefinite in una ListView

Segui queste istruzioni per eseguire l'esempio e non esitare a pubblicare il tuo feedback o le tue domande nel forum dell'API Google Tasks.