2013-05-03 26 views
16

tôi về cơ bản muốn mở lại các bài chưa được trả lời như sau:Android Lịch: làm thế nào để viết sync adapter cho lịch INSERT

Tôi muốn tận dụng các Lịch Android cung cấp API để tạo lịch và chèn sự kiện vào lịch. Lịch được tạo không được là bản sao cục bộ. Nó phải đồng bộ hóa với Lịch Google (trực tuyến). Tài liệu cho biết trong để thực hiện việc này, tôi phải sử dụng bộ điều hợp đồng bộ hóa. Nhưng làm cách nào để tôi viết bộ điều hợp đồng bộ hóa như vậy?

Cho đến nay tôi đã tìm thấy hai bài đăng sau nhưng không có giải pháp.

Tôi muốn sử dụng API Lịch Android cho điều này và không phải là API của Google để người dùng có thể làm việc ngoại tuyến.

Trả lời

3

Dường như Google đã nhầm lẫn LịchContract về vấn đề này. Tài liệu không hoàn toàn rõ ràng về nó:

... chèn lịch mới nên được thực hiện làm bộ điều hợp đồng bộ hóa.

Cách thức này được diễn đạt với tôi như là cơ hội mỏng có thể hoạt động. Nhưng thực tế nói (đánh giá các câu hỏi SO khác được liên kết của bạn) một ứng dụng bằng CalendarContract không thể tạo lịch được đồng bộ hóa.

Bạn thực sự không muốn trải qua tất cả những rắc rối khi tạo SyncAdapter của riêng bạn. Tôi đã làm điều đó một lần cho một trong các ứng dụng của mình vì tôi muốn có giải pháp đáng tin cậy để có quyền truy cập lịch được đồng bộ hóa trên các thiết bị Ice Cream Sandwich trước (chưa có CalendarContract).

Đó là rất nhiều công việc. Nó liên quan đến việc giao tiếp với API dịch vụ web của Lịch Google (trong khi tôn trọng các giới hạn truy cập của họ), giữ một bản sao dữ liệu cục bộ và đồng bộ hóa chỉ những khác biệt. Cuối cùng, SyncAdapter của riêng bạn cũng sẽ sao chép dữ liệu của Google Calendar SyncAdapter đã tồn tại.

Những gì bạn có thể làm như giải pháp thay thế chỉ là triển khai chức năng "tạo lịch" cần thiết ngay trên Google Calendar online API. Yêu cầu ứng dụng của bạn yêu cầu người dùng cấp quyền qua android.permission.USE_CREDENTIALS.

AccountManager có thể được sử dụng để nhận mã thông báo ủy quyền chính xác để truy cập API Lịch Google. Phương thức getAuthToken yêu cầu thông số loại mã thông báo xác thực. Phần chính xác cho truy cập đọc/ghi lịch là chuỗi ký tự sau đây: "Manage your calendars".

Có hai vấn đề lớn với cách giải quyết đó mặc dù:

  1. Bạn không thể biết chắc chắn nếu đồng bộ hóa lịch phụ trợ làm cho sử dụng Google Calendar. Thật không may là một hộp đen.

  2. Bạn không thể biết chắc chắn khi nào bộ điều hợp đồng bộ hóa lịch sẽ bắt kịp những thay đổi này. Tôi đoán có thể buộc phải đồng bộ hóa lại bằng cách nào đó. Nhưng ngay cả khi đó, ứng dụng của bạn sẽ bị ngừng lại. Bạn không thể chỉ hoạt động dựa trên lịch mới đó và sử dụng nó ngay lập tức. Ứng dụng của bạn phải đợi cho đến khi đồng bộ hóa xảy ra.

Bạn có thể thăm dò ý kiến ​​CalendarContract for that. Hãy để ứng dụng của bạn chờ và tìm kiếm các thay đổi trong chuỗi nền cho đến khi lịch mới hiển thị. Sau đó, bạn có id địa phương của nó và di chuyển trên.

+1

Đã gần một năm kể từ câu trả lời này, có bản cập nhật không? – Clocker

+0

@Clocker Tôi chỉ nhìn vào câu hỏi SO được liên kết của Dragan và có người đề cập rằng có thể tạo lịch địa phương. Tôi đoán đó sẽ là giải pháp di động dễ dàng nhất (di động theo nghĩa là nó không phụ thuộc vào một chương trình phụ trợ dịch vụ web lịch cụ thể). – tiguchi

2

Không thể tạo lịch có thể đồng bộ hóa với tài khoản Google (Gmail) theo lập trình bằng API Clanedar ngay bây giờ. SyncAdapter có thể được sử dụng để tạo tài khoản không phải Gmail mới và tạo lịch mới ở đó nhưng chúng không thể đồng bộ hóa với Lịch Google.

Thêm chi tiết tại đây: https://stackoverflow.com/a/19734278/237232

Các vấn đề liên quan