9

如何将事件自动添加到日历中?如果我使用此源代码,它会打开带有填充条目的日历,但我必须单击保存按钮才能保存它。如何将事件自动添加到日历中?

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

} 


} 

回答

7

我发布了你在我的应用程序在市场上使用的这段代码。它自动将事件添加到用户日历。它不使用需要用户操作的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; 
} 
+0

我完全不知道ICS,它是一种自动保存事件的方法吗?内容值出现错误。我怎样才能描述像这样的非静态值calendarevent.java – ebruszl

+0

CalendarEvent就像'public class CalendarEvent { \t \t private String title; \t private String descr; \t私人字符串位置; \t private long startTime; \t private long endTime; \t private String idCalendar; //获取并设置方法'你有什么样的错误? – FrancescoAzzola

+0

我拿了“04-19 15:09:51.645:E/ActivityThread(12428):无法找到日历的提供者信息”这个错误 – ebruszl

0

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

顺便说一句,Google建议使用Intents与日历交互。

但是,如果您确实想要自动插入事件,则您的应用必须在清单中具有WRITE_CALENDAR权限。您不使用Intents,而是使用ContentResolver。您可以在https://developer.android.com/guide/topics/providers/calendar-provider.html的部分添加事件中查看示例代码。

2

我用以下代码在我自己创建的日历

公共无效SyncEvent添加事件( long id,int meeting_id,String EventName, String Stime,S字符串描述){

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

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

  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

这工作对我来说。谢谢。 – Pete

+0

我在这一行得到异常Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI,values); – Pranita