Sử dụng API Tasks trên Android

Cảnh báo: Tài liệu này không còn được dùng nữa. Để biết thông tin về cách uỷ quyền cho các ứng dụng Android bằng OAuth 2.0, vui lòng xem Tài liệu về việc uỷ quyền cho Dịch vụ Android Play.

Tài liệu này giải thích cách sử dụng API Tasks với OAuth 2.0 trên Android. Hướng dẫn này mô tả cơ chế cấp quyền để được cấp quyền truy cập vào Google Tasks của người dùng và cách bạn có thể chuẩn bị sẵn sàng sử dụng Đối tượng dịch vụ API Tasks trong ứng dụng Android.

Để ứng dụng Android của bạn sử dụng API Tasks, bạn cần thực hiện một số bước sau:

  1. Chọn Tài khoản Google của người dùng
  2. Nhận mã truy cập OAuth 2.0 từ AccountManager cho API tác vụ
  3. Xác định dự án và thiết lập Đối tượng dịch vụ Tasks
  4. Gọi lệnh đến API Tasks

Nhập thư viện ứng dụng của Google

Các mẫu bạn sẽ tìm thấy trong tài liệu này sử dụng Thư viện ứng dụng API của Google cho Java. Bạn cần thêm các tệp chứa sau vào ứng dụng Android. Để thực hiện, hãy đặt các tệp chứa danh sách dưới đây vào thư mục /Assets ở thư mục gốc của ứng dụng Android. Đồng thời, kiểm tra các phiên bản mới vì tài liệu này cũ hơn.

Nhập các tệp thư viện ứng dụng Google API và các tiện ích Android của tệp đó (tất cả các phần của 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

Nhập tệp jar cụ thể cho Tasks:

Nhập phần phụ thuộc (tất cả các phần của 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

Tài khoản Google trong Android

Kể từ Android 2.0, AccountManager quản lý các tài khoản mà bạn đã đăng ký trong môi trường của mình, các tài khoản được liệt kê trong phần Cài đặt > Tài khoản & đồng bộ hoá. Cụ thể, ứng dụng này xử lý quy trình uỷ quyền và có thể tạo các mã thông báo uỷ quyền cần thiết để truy cập vào dữ liệu bằng API.

Tài khoản đã đăng ký trong môi trường Android của bạn
Tài khoản đã đăng ký trong môi trường Android của bạn

Để có thể sử dụng AccountManager để nhận tài khoản và yêu cầu mã thông báo uỷ quyền, bạn cần thêm các quyền sau vào tệp kê khai ứng dụng Android của mình:

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

Bạn có thể sử dụng AccountManager để tạo Tài khoản Google mà bạn muốn truy cập vào Tasks. AccountManager không chỉ quản lý Tài khoản Google mà còn quản lý tài khoản từ các nhà cung cấp khác. Do đó, bạn cần yêu cầu cụ thể về Tài khoản Google bằng cách sử dụng mã bên dưới:

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

Ngoài ra, Thư viện ứng dụng API của Google cho Java đi kèm với GoogleAccountManager chỉ xử lý các Tài khoản Google:

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

Nếu có nhiều Tài khoản Google trên thiết bị Android, bạn nên nhắc người dùng về tài khoản mà họ muốn sử dụng bằng một hộp thoại có dạng như sau:

Hộp thoại chọn tài khoản
Hộp thoại chọn tài khoản

Bạn có thể tạo một hộp thoại như vậy bằng cách sử dụng mã chuyển/trường hợp sau đây trong phương thức onCreateDialog của hoạt động:

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

Việc gọi showDialog(DIALOG_ACCOUNTS) sẽ hiển thị hộp thoại trình chọn tài khoản.

Quy trình uỷ quyền API Google trên Android

Bây giờ, người dùng đã chọn một tài khoản, nên chúng ta có thể yêu cầu AccountManager cấp mã truy cập OAuth 2.0 cho API tác vụ. Việc này được thực hiện bằng cách gọi phương thức AccountManager.getAuthToken(). Trong quá trình gọi AccountManager.getAuthToken(), AccountManager sẽ xử lý việc liên hệ với điểm cuối ủy quyền API của Google. Khi AccountManager đã truy xuất mã thông báo uỷ quyền, trình quản lý này sẽ chạy AccountManagerCallback mà bạn đã xác định trong lệnh gọi phương thức:

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

Như bạn có thể đã biết, AccountManager của Android có hỗ trợ thử nghiệm cho OAuth 2.0. Bạn chỉ cần thêm tiền tố vào phạm vi của API mà bạn muốn truy cập bằng oauth2: khi đặt oauth2:. Vì vậy, đối với API Tasks, bạn có thể sử dụng:

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

Vấn đề khi sử dụng giá trị AUTH_TOKEN_TYPE ở trên là chuỗi OAuth2:https://www.googleapis.com/auth/tasks sẽ hiển thị trong hộp thoại ủy quyền dưới dạng tên của sản phẩm Google mà bạn muốn truy cập. Để giải quyết vấn đề này, đã có các email đại diện đặc biệt — mà con người có thể đọc được — AUTH_TOKEN_TYPE dành cho API Tasks. Các lớp này tương đương với việc sử dụng phạm vi OAuth 2.0. Ví dụ: bạn có thể sử dụng:

String AUTH_TOKEN_TYPE = "Manage your tasks";

Bạn cũng có thể sử dụng bí danh AUTH_TOKEN_TYPE Xem công việc của bạn tương đương với phạm vi chỉ đọc của API Tasks: OAuth2:https://www.googleapis.com/auth/tasks.readonly.

Trong khi thực hiện lệnh gọi AccountManager.getAuthToken(), AccountManager sẽ kiểm tra xem ứng dụng của bạn đã được cho phép truy cập vào API Tasks hay chưa. Nếu ứng dụng của bạn chưa được cấp quyền, Hoạt động sẽ được AccountManager bắt đầu. Trình quản lý tài khoản sẽ hiển thị hộp thoại uỷ quyền để người dùng có thể Cho phép hoặc Từ chối ứng dụng của bạn sử dụng API Tasks trên tài khoản của họ.

Hộp thoại ủy quyền
Hộp thoại ủy quyền

Nếu người dùng từ chối quyền truy cập của ứng dụng vào Tasks API, thì OperationCanceledException sẽ được gửi trong lệnh gọi Future.getResult(). Ví dụ: bạn nên xử lý linh hoạt bằng cách yêu cầu chọn lại tài khoản hoặc hiện thông báo kèm theo nút cho phép truy cập lại.

Xác định ứng dụng của bạn và thiết lập Đối tượng dịch vụ Tasks API

Giờ đây, ứng dụng của bạn đã có quyền truy cập vào API Tasks và đã được cấp một mã truy cập, bạn cũng cần có một Khoá API cần lấy từ một dự án trong Bảng điều khiển API của Google vì đây là yêu cầu bắt buộc để thực hiện lệnh gọi API Tasks. Để thực hiện, hãy làm theo các bước sau:

  1. Tạo một dự án hoặc sử dụng dự án hiện có
  2. Bật API Tasks trên dự án của bạn bằng cách chuyển nút API Tasks sang trạng thái BẬT
  3. Bạn có thể tìm thấy Khoá API tại Quyền truy cập API > Truy cập API đơn giản > Khoá API

Nhận Khoá API từ Bảng điều khiển API
Nhận Khoá API từ Bảng điều khiển API

Khoá API là bắt buộc vì khoá này xác định ứng dụng của bạn, do đó cho phép API khấu trừ hạn mức và sử dụng quy tắc hạn mức đã xác định cho dự án của bạn. Bạn cần chỉ định Khoá API trên Đối tượng dịch vụ 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 chỉ có hiệu lực trong một khoảng thời gian nhất định, vì vậy, bạn sẽ phải nhận một mã mới khi mã này hết hạn. Có 2 cách xử lý vấn đề này:

  • Yêu cầu accessToken cho AccountManager mỗi khi bạn thực hiện yêu cầu thông qua API. Vì AccountManager lưu vào bộ nhớ đệm mã thông báo, nên giải pháp này được chấp nhận.
  • Hãy tiếp tục sử dụng accessToken cho đến khi bạn gặp lỗi 403 khi đó bạn yêu cầu một mã thông báo mới cho AccountManager.

Thao tác với tác vụ thông qua API

Tại thời điểm này, bạn sẽ có một Đối tượng dịch vụ API Tasks được thiết lập đầy đủ mà có thể dùng để truy vấn API theo Hướng dẫn dành cho nhà phát triển API Tasks, chẳng hạn như:

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

Đừng quên thêm quyền truy cập Internet vào tệp kê khai ứng dụng Android của bạn, nếu không, các yêu cầu ở trên đến các điểm cuối của API Tasks sẽ không thành công:

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

Ứng dụng mẫu

Gần đây, chúng tôi đã thêm một mẫu mới vào Thư viện ứng dụng API của Google cho kho lưu trữ mẫu Java để giúp bạn bắt đầu sử dụng API Tasks và OAuth 2.0 trên Android. Mẫu này là một ứng dụng Android đơn giản nhưng hoạt động đầy đủ. Ứng dụng này yêu cầu uỷ quyền để sử dụng API Tasks và hiển thị các công việc của danh sách công việc mặc định trong ListView.

Hiển thị các công việc trong danh sách công việc mặc định trong ListView
Hiển thị các công việc trong danh sách công việc mặc định trong ListView

Hãy làm theo instructions này để chạy mẫu và đừng ngại đăng phản hồi hoặc câu hỏi của bạn lên Diễn đàn API Google Tasks.