我怎样才能将事件自动添加到日历?

我怎样才能将事件自动添加到日历 如果我使用这个源代码,它打开带有填充条目的日历,但是我必须点击保存button来保存它。

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

Solutions Collecting From Web of "我怎样才能将事件自动添加到日历?"

我发布了你在我的应用程序在市场上使用这个代码。 它自动添加事件到用户日历。 它不使用需要用户操作的Intent。

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

对于ICS和更高版本

 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就像

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

我已经使用以下代码在我自己创build的日历中添加事件

public void SyncEvent(long id,int meeting_id,String EventName,String Stime,String 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(); } } 

此代码添加一个事件,并在日历视图中显示事件。 没有点击“保存”/用户交互需要。

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

如果您使用Intents与日历提供程序进行通信,则如您所注意到的那样,日历应用程序会要求用户进行确认。 这是因为使用Intents意味着你不需要请求任何特定的权限。

顺便说一下,Googlebuild议使用Intents与日历交互。

但是,如果您希望自动插入事件,则应用程序必须在清单中具有WRITE_CALENDAR权限。 而不是使用意图,你使用一个ContentResolver。 您可以在https://developer.android.com/guide/topics/providers/calendar-provider.html 添加事件部分查看示例代码。