2012-09-17 34 views
10

Tôi đang cố gắng tạo lịch trên tài khoản của mình để lấp đầy các sự kiện tôi nhận được từ một số trang web. Tôi đã tìm kiếm và tìm thấy một số ví dụ lịch android 4.0 mới mà tôi đã sửa đổi để có được những gì tôi cần. Vấn đề là lịch được tạo ra, chứa đầy các sự kiện nhưng không được đồng bộ hóa với lịch google, vì vậy trong lần đồng bộ hóa tiếp theo, nó sẽ bị xóa. Funcion tôi sử dụng là những:Tạo lịch được đồng bộ hóa mới với android api

Đây là một cho thêm lịch mới nếu không alreay tồn tại:

public static Uri createCalendarWithName(Context ctx, String name,String accountName) { 

      Uri target = Uri.parse(CalendarContract.Calendars.CONTENT_URI.toString()); 
      target = target.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") 
      .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, accountName) 
      .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.google").build(); 

      ContentValues values = new ContentValues(); 
      values.put(Calendars.ACCOUNT_NAME, accountName); 
      values.put(Calendars.ACCOUNT_TYPE, "com.google"); 
      values.put(Calendars.NAME, name); 
      values.put(Calendars.CALENDAR_DISPLAY_NAME, name); 
      values.put(Calendars.CALENDAR_COLOR, 0x00FF00); 
      values.put(Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_ROOT); 
      values.put(Calendars.OWNER_ACCOUNT, accountName); 
      values.put(Calendars.VISIBLE, 1); 
      values.put(Calendars.SYNC_EVENTS, 1); 
      values.put(Calendars.CALENDAR_TIME_ZONE, "Europe/Rome"); 
      values.put(Calendars.CAN_PARTIALLY_UPDATE, 1); 
      values.put(Calendars.CAL_SYNC1, "https://www.google.com/calendar/feeds/" + accountName + "/private/full"); 
      values.put(Calendars.CAL_SYNC2, "https://www.google.com/calendar/feeds/default/allcalendars/full/" + accountName); 
      values.put(Calendars.CAL_SYNC3, "https://www.google.com/calendar/feeds/default/allcalendars/full/" + accountName); 
      values.put(Calendars.CAL_SYNC4, 1); 
      values.put(Calendars.CAL_SYNC5, 0); 
      values.put(Calendars.CAL_SYNC8, System.currentTimeMillis()); 

      Uri newCalendar = ctx.getContentResolver().insert(target, values); 

      return newCalendar; 
    } 

và một trong đó tạo sự kiện mới mà không cần sự tương tác:

public static Uri createEventWithName(Context ctx, long id, String name, String data) { 
     long startMillis = 0; 
     long endMillis = 0;  
     int id2=(int)id; 
     String[] divisi = data.split("/"); 
     Calendar beginTime = Calendar.getInstance(); 
     beginTime.set(2012,Integer.parseInt(divisi[0])-1, Integer.parseInt(divisi[1])); 
     startMillis = beginTime.getTimeInMillis(); 
     Calendar endTime = Calendar.getInstance(); 
     endTime.set(2012,Integer.parseInt(divisi[0])-1, Integer.parseInt(divisi[1])); 
     endMillis = endTime.getTimeInMillis(); 


     ContentValues cv = new ContentValues(); 
     cv.put(Events.TITLE, name); 
     cv.put(Events.DTSTART, startMillis); 
     cv.put(Events.DTEND, endMillis); 
     cv.put(Events.CALENDAR_ID, id2); 
     Log.d("aggiungo a calendario",Integer.toString(id2)); 
     cv.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().toString()); 
     //cv.put(Events.RRULE, "FREQ=DAILY;INTERVAL=2"); 

     Uri newEvent = ctx.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, cv); 
     return newEvent; 
} 

Tôi không có kinh nghiệm trong lập trình Android vì vậy tôi nghĩ rằng đó là một câu hỏi ngu ngốc =) tôi đã đọc rằng accountName và Loại tài khoản phải giống với tài khoản được lưu trữ trên thiết bị Android, nếu không sự kiện sẽ bị hủy. Tôi nhận được accountName từ api android và tôi nghĩ rằng họ là chính xác. Loại tài khoản dường như hoạt động cho các loại khác ....

Nhờ có ai giúp tôi!

+0

Không có câu hỏi ngu ngốc, chỉ có những người bạn chưa biết câu trả lời :) – Codeman

Trả lời

1

Theo Javadoc cho CalendarContract.Calendars:

"Lịch được thiết kế để chủ yếu quản lý bởi một sync adapter, và chèn lịch mới nên được thực hiện như một bộ chuyển đổi đồng bộ."

Nếu bạn không phải là bộ điều hợp đồng bộ hóa (nếu bạn chỉ là một ứng dụng tùy ý, bạn không phải là bộ điều hợp đồng bộ hóa), điều đó có thể giải thích tại sao lịch mới của bạn không được đồng bộ hóa như bạn mong đợi.

2

Hiện không thể thực hiện được.

Sau nhiều lần googling tôi không thể tìm thấy cách tạo lịch mới có thể đồng bộ hóa trong tài khoản Gmail (loại tài khoản "com.google"). Tôi đã thử các kịch bản này:
1. không có SyncAdapter và tôi nhận được cùng một hành vi - lịch xuất hiện trong ứng dụng Lịch Google bên ngoài với tất cả các sự kiện tôi đã thêm nhưng ngay sau đó (ví dụ: sau vài giây) tất cả các sự kiện và lịch biến mất.
2. với SyncAdapter và xác thực com.google - Tôi nhận được một lỗi trong quá trình
3. với SyncAdapter và com.example xác thực - có thể tạo ra lịch nhưng không có trong tài khoản Gmail

Lưu ý bạn có thể tạo tài khoản mới và tạo lịch mới cho tài khoản đó (sử dụng SyncAdapter, kịch bản 3) nhưng không phải là tài khoản Gmail để lịch không đồng bộ với Lịch Gmail (ví dụ: nếu bạn đăng nhập vào tài khoản Gmail trong trình duyệt web và mở Lịch Google mà bạn vừa tạo sẽ không hiển thị).

2

từ http://developer.android.com/reference/android/provider/CalendarContract.html

public static String thức ACCOUNT_TYPE_LOCAL

gia tăng ở mức API 14 Một loại tài khoản đặc biệt cho lịch không kết hợp với bất kỳ tài khoản. Thông thường các lịch không khớp với tài khoản trên thiết bị sẽ bị xóa. Đặt tài khoản_type theo số lịch này sẽ ngăn không cho nó bị xóa nếu nó không khớp với tài khoản hiện có.

See Also ACCOUNT_TYPE Giá trị không đổi: "LOCAL"

2

Cùng một vấn đề tôi đã phải đối mặt. Sau khi thực hiện thay đổi dưới đây ngay bây giờ, tôi thấy các sự kiện vĩnh viễn gắn bó với lịch của tôi.

Trong phương pháp addEvent thêm dòng dưới đây

Uri uri = getContentResolver().insert(asSyncAdapter(Events.CONTENT_URI,"[email protected]","com.gmail"), cv); 

Mã cho asSyncAdapter như sau

static Uri asSyncAdapter(Uri uri, String account, String accountType) { 
     return uri.buildUpon() 
      .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true") 
      .appendQueryParameter(Calendars.ACCOUNT_NAME, account) 
      .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build(); 
    } 
Các vấn đề liên quan