我如何可以自动添加事件到日历? 如果我用这个源代码,它打开充满项日历,但我必须点击Save按钮保存。
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);
}
}
我发布你这个代码是我在市场上的应用程序的一个应用。 它增加了自动事件给用户的日历。 它不使用意图,需要一个用户操作。
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;
}
我用下面的代码在我自己创建的日历添加事件
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();
}
}
如果您使用的意图与日历供应商进行沟通,那么,你已经注意到,日历应用程序请求用户确认。 这是因为使用意图意味着你不需要请求任何特殊权限。
顺便说一句,谷歌建议使用意图的与日历交互。
但是,如果你想事件的自动插入,你的应用程序必须有WRITE_CALENDAR
在清单的权限。 除了使用意图的,您可以使用ContentResolver的。 你可以看到在示例代码https://developer.android.com/guide/topics/providers/calendar-provider.html的部分添加事件 。
此代码添加一个事件,并显示在日历视图中的事件。 需要在“保存” /用户交互没有点击。
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);