2011-12-31 61 views
7

Tôi gặp sự cố khi tìm giải pháp cho vấn đề của mình. Tôi đang cố gắng thêm nhiều sự kiện vào lịch Android của mình nhưng tôi không biết cách thực hiện. Tôi đã tìm thấy mã này:Chèn nhiều sự kiện vào lịch Android

 Calendar cal = Calendar.getInstance();    
      Intent intent = new Intent(Intent.ACTION_EDIT); 
      intent.setType("vnd.android.cursor.item/event"); 
      intent.putExtra("beginTime", cal.getTimeInMillis()); 
      intent.putExtra("allDay", true); 
      intent.putExtra("rrule", "FREQ=YEARLY"); 
      intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000); 
      intent.putExtra("title", "A Test Event from android app"+String.valueOf(i)); 
      startActivity(intent); 

nhưng tất cả việc cần làm là gửi cho tôi lịch của mình và cho phép tôi chỉnh sửa và chèn sự kiện của mình theo cách thủ công. Tôi muốn tự động chèn các sự kiện, mà không cần đến ứng dụng lịch của tôi. Hơn nữa, tôi chỉ có thể thêm một sự kiện bằng cách sử dụng mã này. Đây không phải là những gì tôi muốn. Tôi có 2 chuỗi String, một mảng chứa ngày tháng và một chứa tên của sự kiện. Có ai biết nếu có cách nào để làm điều này? Tôi đã tìm kiếm một giải pháp trong một thời gian và không tìm thấy một giải pháp nào. Tôi sẽ biết ơn nếu có ai giúp tôi. Cảm ơn bạn!

Tôi đã giải quyết được vấn đề! Cảm ơn nhiều! Nhưng bây giờ tôi có một vấn đề khác mà tôi không thể giải quyết được. Tôi có mã này:

 ContentValues cv = new ContentValues(); 
     cv.put("calendar_id", calIds[0]); 
     cv.put("title", title); 
     //cv.put("dtstart", dtstart); 
     //cv.put("dtend", dtend); 
     cv.put("rrule", "FREQ=MONTHLY"); 
     cv.put("description", comment); 
     Calendar start = Calendar.getInstance(); 
     start.set(2012, 0, 2, 8, 0, 0); 

     Calendar end = Calendar.getInstance(); 
     end.set(2012, 0, 2, 9, 0, 0); 

     long startTime = start.getTimeInMillis();  
     long endTime = end.getTimeInMillis(); 

     cv.put("dtstart", startTime); 
     cv.put("dtend", endTime); 
     //Insertion on the events of the calendar 
     cr.insert(Uri.parse("content://com.android.calendar/events"), cv); 

Nó chèn sự kiện của tôi nhưng nó không lặp lại. Tôi có nghĩa là sự kiện của tôi xuất hiện vào ngày 2 tháng 2 năm 2012 nhưng vào ngày 2 tháng 1 năm 2013 thì không và cũng không xảy ra trong năm 2014 và v.v. Vì vậy, tôi đã mở lịch của mình trên điện thoại và cố gắng chỉnh sửa sự kiện của mình và tôi thấy rằng tôi nên chọn sự xuất hiện của sự kiện ở đó vào ngày 2 tháng 1 năm 2012 chứ không phải vào ngày 2 tháng 1. điện thoại. Mặt khác, nếu tôi cố gắng thêm một sự kiện theo cách thủ công từ điện thoại của tôi thì nó hoạt động tốt (ý tôi là tôi có thể thêm một sự kiện xảy ra hàng năm).

Trả lời

5

SDK Android không hiển thị bất kỳ giao diện nào để thao tác lịch nhưng bạn có thể tìm thấy từ mã nguồn Android. Android lưu trữ lịch trong cơ sở dữ liệu sqlite nội bộ, mặc dù nó được bảo vệ khỏi truy cập trực tiếp nhưng bạn vẫn có thể thêm/xóa/cập nhật/truy vấn dữ liệu lịch thông qua ContentResolver. Một đoạn mã để chèn một sự kiện có thể là như thế này:

public String addEvent(String calendarId, String title, long startTime, 
     long endTime, int allDay) { 
    ContentValues event = new ContentValues(); 
    event.put("calendar_id", calendarId); // "" for insert 
    event.put("title", title); 
    event.put("description", ""); 
    event.put("eventLocation", ""); 
    event.put("allDay", allDay); 
    event.put("eventStatus", 1); 
    event.put("transparency", 0); 
    event.put("dtstart", startTime); 
    event.put("dtend", endTime); 

    ContentResolver contentResolver = this.context.getContentResolver(); 
    Uri eventsUri = Uri.parse("content://com.android.calendar/calendars"); 
    Uri url = contentResolver.insert(eventsUri, event); 
    String ret = url.toString(); 
    return ret; 
} 

Khi bạn chèn một sự kiện thành công, một chuỗi đại diện cho uri của sự kiện này sẽ được trả về bởi ContentResolver.insert, bạn có thể truy vấn, cập nhật hoặc xóa nó sau này . Trong các SDK trước đó trước SDK 8, nội dung lịch của lịch là "content: // calendar/calendar" khác với SDks 8 và sau đó.
Trong khi đó, hãy cẩn thận với những roms tùy chỉnh này. vì API lịch không được ghi chú trong tài liệu SDK, nhà cung cấp lịch có thể được sửa đổi hoặc thậm chí bị xóa bởi một số nhà cung cấp và nhà khai thác, do đó bạn có thể phải thử nghiệm ứng dụng của mình với nhiều thiết bị.
Chúc bạn may mắn!

+0

Trên thực tế cuối cùng họ đã thêm vào một API Lịch chính thức trong ICS: http://developer.android.com/reference/android/provider/CalendarContract.html –

+0

nhờ @mbaird, nó thực sự là một tin tức tốt lành! Tôi không làm việc trên Android trong một thời gian và tôi nên bắt kịp với phiên bản mới nhất. – hago

+0

Tôi đã giải quyết được vấn đề nhưng bây giờ tôi có một vấn đề khác. Nếu bạn có thể giúp tôi thêm một lần nữa, tôi sẽ rất biết ơn ... Tôi đã chỉnh sửa câu hỏi của mình về vấn đề khác. – Lara

0
public Uri createEvent(int calId, ICalEvent event) { 
     ContentValues eventValues = new ContentValues(); 

     eventValues.put("calendar_id", calId); 
     eventValues.put("title", event.getSummary()); 
     eventValues.put("description", event.getDescription()); 
     eventValues.put("eventLocation", event.getLocation()); 

// eventValues.put("UID", "ADE52556e6976657273697465323031302f323031312d323637392d302d3131"); 
// originalEvent 
     eventValues.put("originalEvent", event.getUid() + ";" + event.getLastModif().getTime()); 

     long startTime = event.getStart().getTime();//System.currentTimeMillis() + 1000 * 60 * 60; 
     long endTime = event.getEnd().getTime();//System.currentTimeMillis() + 1000 * 60 * 60 * 2; 

     eventValues.put("dtstart", (event.isWholeDayEvent() ? endTime : startTime)); 
     eventValues.put("dtend", endTime); 

     eventValues.put("allDay", (event.isWholeDayEvent() ? 1 : 0)); // 0 for false, 1 for true 
     eventValues.put("eventStatus", 1); 
     eventValues.put("visibility", 0); 
     eventValues.put("transparency", 0); 
     eventValues.put("hasAlarm", 0); // 0 for false, 1 for true 

     System.out.println("USING SYNC ACCOUNT " + sync_account); 

     eventValues.put("_sync_account_type", sync_account); 

     Uri eventsUri = Uri.parse(getCalendarUriBase()+"events"); 

     Uri insertedUri = activity.getContentResolver().insert(eventsUri, eventValues); 
     return insertedUri; 
    } 
Các vấn đề liên quan