Korzystanie z interfejsu API Listy zadań na Androidzie

Ostrzeżenie: ten dokument jest wycofany. Informacje o autoryzowaniu aplikacji na Androida za pomocą OAuth 2.0 znajdziesz w dokumentacji dotyczącej autoryzacji Usług Google Play.

Z tego dokumentu dowiesz się, jak używać interfejsu Tasks API z OAuth 2.0 na Androidzie. W tym artykule znajdziesz opis mechanizmów autoryzacji umożliwiających uzyskanie dostępu do listy zadań Google użytkownika oraz informacje o tym, jak w swojej aplikacji na Androida możesz użyć gotowego obiektu usługi interfejsu Tasks API.

Aby aplikacja na Androida mogła korzystać z interfejsu Tasks API, musisz wykonać kilka czynności:

  1. Wybierz konto Google użytkownika
  2. Uzyskiwanie tokena dostępu OAuth 2.0 z interfejsu AccountManager API Zadań
  3. Określ projekt i skonfiguruj obiekt usługi zadań
  4. Wywoływanie interfejsu Tasks API

Importowanie biblioteki klienta Google

Przykłady w tym dokumencie korzystają z biblioteki klienta interfejsów API Google dla języka Java. Musisz dodać do aplikacji na Androida wymienione poniżej pliki JAR. Aby to zrobić, umieść je w folderze /assets w katalogu głównym aplikacji. Sprawdzaj też nowe wersje, gdy ten dokument się starzeje.

Zaimportuj pliki JAR biblioteki klienta interfejsów API Google i jej rozszerzeń na Androida (wszystkie są częścią pliku 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

Zaimportuj plik jar dotyczący Tasks:

Zaimportuj zależności (wszystkie elementy z pliku 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

Konta Google na Androidzie

Od wersji 2.0 Androida usługa AccountManager zarządza kontami zarejestrowanymi w Twoim środowisku, czyli tymi, które są wymienione w sekcji Ustawienia > Konta i synchronizacja. W szczególności obsługuje proces autoryzacji i może generować tokeny autoryzacji, które są wymagane do uzyskiwania dostępu do danych za pomocą interfejsów API.

Konta zarejestrowane w Twoim środowisku Androida
Konta zarejestrowane w środowisku Androida

Aby móc używać usługi AccountManager do uzyskiwania kont i wysyłania żądań dotyczących tokenów autoryzacji, musisz dodać te uprawnienia w pliku manifestu aplikacji na Androida:

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

Aby uzyskać dostęp do Listy zadań na koncie Google, którego chcesz użyć, możesz użyć AccountManager. Użytkownik AccountManager zarządza nie tylko kontami Google, ale też kontami innych dostawców. Dlatego musisz poprosić o konto Google, używając tego kodu:

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

Alternatywnie biblioteka klienta interfejsów API Google dla języka Java zawiera klasę GoogleAccountManager, która obsługuje tylko konta Google:

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

Jeśli na urządzeniu z Androidem jest dostępne więcej niż 1 konto Google, poproś użytkownika o wybranie konta, którego chce użyć. Możesz użyć okna dialogowego podobnego do tego:

Okno wyboru konta
Okno wyboru konta

Taki dialog możesz utworzyć, używając w metodzie onCreateDialog swojej czynności kodu switch/case:

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

Wywołanie showDialog(DIALOG_ACCOUNTS) spowoduje wyświetlenie okna wyboru konta.

Proces autoryzacji interfejsów Google API na Androidzie

Użytkownik wybrał już konto, więc możemy poprosić AccountManager o wydanie tokena dostępu OAuth 2.0 dla interfejsu Task API. Aby to zrobić, wywołaj metodę AccountManager.getAuthToken(). Podczas wywołania metody AccountManager.getAuthToken() obiekt AccountManager skontaktuje się z punktem końcowym autoryzacji interfejsów API Google. Gdy usługa AccountManager pobierze token autoryzacji, uruchomi zdefiniowaną przez Ciebie w wywołaniu metody funkcję AccountManagerCallback:

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

Jak zapewne wiesz, AccountManager na Androida obsługuje w wersji eksperymentalnej protokół OAuth 2.0. Wystarczy, że przed zakresem interfejsu API, do którego chcesz uzyskać dostęp, dodasz prefiks oauth2:, gdy ustawiasz parametr AUTH_TOKEN_TYPE. W przypadku interfejsu Tasks API możesz użyć:

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

Problem z użyciem tej wartości jako AUTH_TOKEN_TYPE polega na tym, że w oknie autoryzacji jako nazwa usługi Google, do której chcesz uzyskać dostęp, wyświetlany jest ciąg znaków oauth2:https://www.googleapis.com/auth/tasks. Aby temu zaradzić, w interfejsie Tasks API dostępne są specjalne aliasy AUTH_TOKEN_TYPE, które można odczytać. Są one równoważne z używaniem zakresu OAuth 2.0. Możesz na przykład użyć:

String AUTH_TOKEN_TYPE = "Manage your tasks";

Możesz też użyć aliasu AUTH_TOKEN_TYPE Wyświetl swoje zadania, który jest odpowiednikiem zakresu interfejsu Tasks API tylko do odczytu: oauth2:https://www.googleapis.com/auth/tasks.readonly.

Podczas wywołania metody AccountManager.getAuthToken() menedżer AccountManager sprawdzi, czy Twoja aplikacja ma autoryzację dostępu do interfejsu Tasks API. Jeśli Twoja aplikacja nie została jeszcze autoryzowana, Activity jest uruchamiana przez AccountManager, który wyświetla użytkownikowi okno autoryzacji, aby ten mógł zezwolić lub odmówić dostępu aplikacji do interfejsu API Tasks na swoim koncie.

Okno autoryzacji
Okno autoryzacji

Jeśli użytkownik odmówi aplikacji dostępu do interfejsu Tasks API, podczas wywołania future.getResult() zostanie rzucony wyjątek OperationCanceledException. Należy to zrobić w łagodny sposób, np. prosząc o wybranie konta ponownie lub wyświetlając komunikat z przyciskiem umożliwiającym ponowne autoryzowanie dostępu.

Identyfikowanie aplikacji i konfigurowanie obiektu usługi interfejsu Tasks API

Teraz, gdy Twoja aplikacja ma autoryzację dostępu do interfejsu Tasks API i token dostępu, musisz też uzyskać klucz API z projektu w Konsoli interfejsów API Google, ponieważ jest on wymagany do wywoływania interfejsu Tasks API. Aby to zrobić:

  1. Utwórz projekt lub użyj istniejącego
  2. Włącz interfejs Tasks API w projekcie, przełączając przełącznik Tasks API w pozycji ON (wł.).
  3. Klucz API znajdziesz w sekcji Dostęp przez interfejs API > Prosty dostęp przez interfejs API > Klucz API.

Pobieranie klucza API z Konsoli interfejsów API
Pobieranie klucza API z Konsoli interfejsów API

Klucz interfejsu API jest wymagany, ponieważ identyfikuje Twoją aplikację i umożliwia interfejsowi API odliczanie limitu i stosowanie reguł limitu zdefiniowanych dla Twojego projektu. Musisz podać klucz interfejsu API w obiekcie service usługi 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 jest ważny tylko przez określony czas, więc po jego wygaśnięciu musisz uzyskać nowy. Możesz to zrobić na 2 sposoby:

  • Za każdym razem, gdy wysyłasz żądania za pomocą interfejsu API, wysyłaj do AccountManager prośbę o accessToken. Ponieważ AccountManager przechowuje token w pamięci podręcznej, to rozwiązanie jest do przyjęcia.
  • Używaj accessToken, aż pojawi się błąd 403. W tym momencie poproś AccountManager o nowy token.

Manipulowanie zadaniami za pomocą interfejsu API

W tym momencie powinieneś mieć w pełni skonfigurowany obiekt service interfejsu Tasks API, którego możesz używać do wysyłania zapytań do interfejsu API zgodnie z przewodnikiem dla deweloperów interfejsu Tasks API, na przykład:

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

Pamiętaj, aby dodać do pliku manifestu aplikacji na Androida uprawnienia dostępu do Internetu, ponieważ w przeciwnym razie żądania do punktów końcowych interfejsu Tasks API nie będą działać:

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

Przykładowa aplikacja

Niedawno dodaliśmy do repozytorium przykładów biblioteki klienta interfejsów API Google dla języka Java nowy przykład, który pomoże Ci zacząć korzystać z interfejsu Tasks API i protokołu OAuth 2.0 na Androidzie. Plik sample.zip zawiera prostą, ale w pełni działającą aplikację na Androida, która prosi o autoryzację na potrzeby korzystania z interfejsu Tasks API i wyświetla zadania z domyślnej listy zadań w elementach ListView.

Wyświetlanie zadań na domyślnej liście zadań w elementach ListView
Wyświetlanie zadań na domyślnej liście zadań w elementach ListView

Aby uruchomić przykład, postępuj zgodnie z tymi instrukcjami. Nie wahaj się też publikować opinii ani pytań na forum interfejsu Google Tasks API.