9

Làm cách nào để tự động thêm sự kiện vào lịch? Nếu tôi sử dụng mã nguồn này, nó sẽ mở Lịch với các mục đã điền, nhưng tôi phải nhấp vào nút lưu để lưu nó.Làm cách nào để tự động thêm sự kiện vào lịch?

public class CalendarApplicationActivity extends Activity 
{ 

public static final String[] EVENT_PROJECTION = new String[] 
{ 
     Calendars._ID, // 0 
     Calendars.ACCOUNT_NAME, // 1 
     Calendars.CALENDAR_DISPLAY_NAME // 2 
}; 


private static final int PROJECTION_DISPLAY_NAME_INDEX = 2; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_calendar_application); 
} 

public void onClick(View view) 
{ 

    Intent intent = new Intent(Intent.ACTION_INSERT); 
    intent.setType("vnd.android.cursor.item/event"); 
    intent.putExtra(Events.TITLE, "Learn Android"); 
    intent.putExtra(Events.EVENT_LOCATION, "Home suit home"); 
    intent.putExtra(Events.DESCRIPTION, "Download Examples"); 

    GregorianCalendar calDate = new GregorianCalendar(2012, 10, 02); 
    intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, 
      calDate.getTimeInMillis()); 
    intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, 
      calDate.getTimeInMillis()); 

    intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true); 


    intent.putExtra(Events.ACCESS_LEVEL, Events.ACCESS_PRIVATE); 
    intent.putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY); 

    startActivity(intent); 

} 


} 

Trả lời

7

Tôi đăng cho bạn mã này được sử dụng trong một trong các ứng dụng của tôi trên thị trường. Nó tự động thêm sự kiện vào lịch người dùng. Nó không sử dụng Intent yêu cầu hành động của người dùng.

public void addEvent(CalendarEvent evt) { 
    //Log.d(Params.LOG_APP, "Insert event ["+evt+"]"); 

    try { 
     Uri evtUri = ctx.getContentResolver().insert(getCalendarUri("events"), CalendarEvent.toContentValues(evt)); 
     Log.d(Params.LOG_APP, "" + evtUri); 
    } 
    catch(Throwable t) { 
     //Log.e(Params.LOG_APP, "", t); 
    } 
} 

public void setContext(Context context) { 
    this.ctx = context; 
    this.baseUri = getCalendarUriBase(); 
} 

private Uri getCalendarUri(String path) { 
    return Uri.parse(baseUri + "/" + path); 
} 

private String getCalendarUriBase() { 
    String calendarUriBase = null; 
    Uri calendars = Uri.parse("content://calendar/calendars"); 
    Cursor managedCursor = null; 
    try { 
     managedCursor = ctx.getContentResolver().query(calendars, null, null, null, null); 
    } catch (Exception e) { 
     // e.printStackTrace(); 
    } 

    if (managedCursor != null) { 
     calendarUriBase = "content://calendar/"; 
    } else { 
     calendars = Uri.parse("content://com.android.calendar/calendars"); 
     try { 
      managedCursor = ctx.getContentResolver().query(calendars, null, null, null, null); 
     } catch (Exception e) { 
      // e.printStackTrace(); 
     } 

     if (managedCursor != null) { 
      calendarUriBase = "content://com.android.calendar/"; 
     } 

    } 

    Log.d(Params.LOG_APP, "URI ["+calendarUriBase+"]"); 
    return calendarUriBase; 
} 

Và đối với ICS và sau

public void addEvent(CalendarEvent evt) { 

    ContentResolver cr = context.getContentResolver(); 
    Uri uri = cr.insert(Events.CONTENT_URI, CalendarEvent.toICSContentValues(evt)); 
    System.out.println("Event URI ["+uri+"]"); 

} 

CalendarEvent là như

public static ContentValues toContentValues(CalendarEvent evt) { 
    ContentValues cv = new ContentValues(); 
    cv.put("calendar_id", evt.getIdCalendar()); 
    cv.put("title", evt.getTitle()); 
    cv.put("description", evt.getDescr()); 
    cv.put("eventLocation", evt.getLocation()); 
    cv.put("dtstart", evt.getStartTime()); 
    cv.put("dtend", evt.getEndTime()); 
    cv.put("eventStatus", 1); 
    cv.put("visibility", 0); 
    cv.put("transparency", 0); 

    return cv; 

} 

public static ContentValues toICSContentValues(CalendarEvent evt) { 

    ContentValues cv = new ContentValues(); 
    cv.put(Events.CALENDAR_ID, evt.getIdCalendar()); 
    cv.put(Events.TITLE, evt.getTitle()); 
    cv.put(Events.DESCRIPTION, evt.getDescr()); 
    cv.put(Events.EVENT_LOCATION, evt.getLocation()); 
    cv.put(Events.DTSTART, evt.getStartTime()); 
    cv.put(Events.DTEND, evt.getEndTime()); 

    Calendar cal = Calendar.getInstance(); 
    TimeZone tz = cal.getTimeZone(); 

    cv.put(Events.EVENT_TIMEZONE, tz.getDisplayName()); 
    /* 
    cv.put(Events.STATUS, 1); 
    cv.put(Events.VISIBLE, 0); 
    cv.put("transparency", 0); 

    return cv; 
    */ 

    return cv; 
} 
+0

Tôi không biết chính xác ICS, có cách nào để lưu sự kiện tự động không? Tôi có lỗi với giá trị nội dung. Làm thế nào tôi có thể mô tả các giá trị không tĩnh calendarevent.java như thế này – ebruszl

+0

CalendarEvent giống như 'public class CalendarEvent { \t \t riêng chuỗi tiêu đề; \t chuỗi riêng descr; \t vị trí Chuỗi riêng tư; \t Thời gian bắt đầu dài riêng tư; \t thời gian kết thúc dài riêng tư; \t Chuỗi riêng idCalendar; // nhận và đặt phương thức' Bạn có lỗi gì? – FrancescoAzzola

+0

tôi mất "04-19 15: 09: 51.645: E/ActivityThread (12428): Không tìm thấy thông tin nhà cung cấp cho lịch" lỗi này – ebruszl

0

Nếu bạn sử dụng Intents để giao tiếp với các nhà cung cấp lịch, sau đó, như bạn đã thấy, ứng dụng lịch yêu cầu xác nhận từ người dùng. Điều này là do sử dụng Intents có nghĩa là bạn không cần yêu cầu bất kỳ quyền cụ thể nào.

Nhân tiện, Google khuyên bạn nên sử dụng Mục đích để tương tác với lịch.

Tuy nhiên, nếu bạn muốn chèn tự động các sự kiện, ứng dụng của bạn phải có sự cho phép WRITE_CALENDAR trong tệp kê khai. Thay vì sử dụng Intents, bạn sử dụng ContentResolver. Bạn có thể xem mã mẫu tại https://developer.android.com/guide/topics/providers/calendar-provider.html trong phần Thêm sự kiện.

2

Tôi đã sử dụng sau mã để thêm sự kiện trong lịch tạo của riêng tôi

public void SyncEvent (id dài, int meeting_id, String EventName, Chuỗi Stime, S tring Etime, String Description) {

Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("GMT-1")); 
Date dt = null; 
Date dt1 = null; 
try { 
    dt = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(Stime); 
    dt1 = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(Etime); 

    Calendar beginTime = Calendar.getInstance(); 
    cal.setTime(dt); 

    // beginTime.set(2013, 7, 25, 7, 30); 
    beginTime.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 
    cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY), 
    cal.get(Calendar.MINUTE)); 

    Calendar endTime = Calendar.getInstance(); 
    cal.setTime(dt1); 

    // endTime.set(2013, 7, 25, 14, 30); 
    // endTime.set(year, month, day, hourOfDay, minute); 
    endTime.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 
    cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY), 
    cal.get(Calendar.MINUTE)); 

    ContentResolver cr = this.mContext.getContentResolver(); 
    ContentValues values = new ContentValues(); 

    values.put(Events.DTSTART, beginTime.getTimeInMillis()); 
    values.put(Events.DTEND, endTime.getTimeInMillis()); 
    values.put(Events.TITLE, EventName); 
    values.put(Events.DESCRIPTION, Description); 
    values.put(Events.CALENDAR_ID, id); 
    // values.put(Events._ID, meeting_id); 
    values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID()); 

    Uri uri = cr.insert(Events.CONTENT_URI, values); 
    long eventID = Long.parseLong(uri.getLastPathSegment()); 
} catch (ParseException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
} 
1

Mã này thêm sự kiện và hiển thị sự kiện trong chế độ xem Lịch. Không cần nhấp vào 'lưu'/tương tác người dùng cần thiết.

  long calID = 3; 
      long startMillis = 0; 
      long endMillis = 0; 
      Calendar beginTime = Calendar.getInstance(); 
      beginTime.set(2015, 6, 12, 7, 30);// set(int year, int month, int day, int hourOfDay, int minute) 
      startMillis = beginTime.getTimeInMillis(); 
      Calendar endTime = Calendar.getInstance(); 
      endTime.set(2015, 6, 12, 8, 30); 
      endMillis = endTime.getTimeInMillis(); 

      TimeZone tz = TimeZone.getDefault(); 

      ContentResolver cr = getContentResolver(); 
      ContentValues values = new ContentValues(); 
      values.put(CalendarContract.Events.DTSTART, startMillis); 
      values.put(CalendarContract.Events.DTEND, endMillis); 
      values.put(CalendarContract.Events.TITLE, "Jazzercise"); 
      values.put(CalendarContract.Events.DESCRIPTION, "Group workout"); 
      values.put(CalendarContract.Events.CALENDAR_ID, calID); 
      values.put(CalendarContract.Events.EVENT_TIMEZONE, tz.getID()); 
      Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values); 

      // get the event ID that is the last element in the Uri 
      long eventID = Long.parseLong(uri.getLastPathSegment()); 


      Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon(); 
      builder.appendPath("time"); 
      ContentUris.appendId(builder, startMillis); 
      Intent intent = new Intent(Intent.ACTION_VIEW).setData(builder.build()); 
      startActivity(intent); 
+0

Điều này làm việc cho tôi. Cảm ơn. – Pete

+0

Tôi nhận được ngoại lệ tại dòng này Uri uri = cr.insert (CalendarContract.Events.CONTENT_URI, giá trị); – Pranita