我的代码:
final Intent calIntent = new Intent(Intent.ACTION_EDIT); calIntent.setType("vnd.android.cursor.item/event"); startActivityForResult(calIntent,RESULT_CODE_OPEN);
但是用最后一个日历打开的意图.我想用他的日历ID打开特定的一个.
我怎样才能做到这一点?
解决方法
打开EditEvent – (回答原始问题)
使用关键CalendarContract.Events.CALENDAR_ID和相应的日历标签(如下面的示例),在Intent上放一个额外的长度:
long calendarId = 1234; // here goes your calendar Id final Intent calIntent = new Intent(Intent.ACTION_EDIT) .setType("vnd.android.cursor.item/event") .putExtra(CalendarContract.Events.CALENDAR_ID,calendarId); startActivityForResult(calIntent,RESULT_CODE_OPEN);
在特定日历上使用月周视图打开日历应用程序 – (回答问题 – 第1部分)
这种方法有点不一样.在打开日历应用程序之前,您应该使所有日历都不可见,但不能选择所有日历.所以,我创建了一个帮助函数来做到这一点.
private void makeAllCalendarsInvisibleExcept(long calendarId) { ContentValues updateValues = new ContentValues(); updateValues.put(CalendarContract.Calendars.VISIBLE,0); // make all invisible getContentResolver().update(CalendarContract.Calendars.CONTENT_URI,updateValues,null,null); updateValues.clear(); updateValues.put(CalendarContract.Calendars.VISIBLE,1); // make calendarId visible getContentResolver().update(CalendarContract.Calendars.CONTENT_URI,where,null); }
这里如何设置它:
makeAllCalendarsInvisibleExcept(calendarId); Intent calIntent = new Intent(); // for google calendar,first parameter should be "com.google.android.calendar" // this is intended for android calendar. ComponentName cn = new ComponentName("com.android.calendar","com.android.calendar.LaunchActivity"); calIntent.setComponent(cn); startActivityForResult(calIntent,4567);
AFAIK,没有办法打开月视.但研究永远不会结束,我将尽快做一个更新.
在DemoApp中,我创建了两个额外的帮助方法来推送和恢复日历可见性状态.看看arround pushCalendarVisibility和restoreCalendarVisibility和onActivityResult
注意:我已经在安装了Google日历和没有安装Google日历的情况下测试了该应用. Google日历上的AFAIK只显示DAY视图,而不是MONEE.
在所有情况下,只显示所选日历上的事件.
calendarId abd帐户名可以使用CalendarContract.Calendars获得,如下所示:
// since API14 Uri uri = CalendarContract.Calendars.CONTENT_URI; String[] projection = new String[] { CalendarContract.Calendars._ID,CalendarContract.Calendars.VISIBLE,CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL,CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,CalendarContract.Calendars.ACCOUNT_NAME,}; Cursor calendarCursor = getContentResolver().query(uri,projection,null); while (calendarCursor.moveToNext()) { // calendarId long calendarId = calendarCursor.getLong(0); // get visibility,warning: if calendar is not visible Intent.ACTION_EDIT doesn't work. boolean calendarVisible = calendarCursor.getInt(1) == 1; // get if it's owned,warning: if calendar is not owned Intent.ACTION_EDIT doesn't work. boolean calendarOwned = calendarCursor.getInt(2) == CalendarContract.Calendars.CAL_ACCESS_OWNER; // get calendar display name String calendarName = calendarCursor.getString(3); // get account name String accountName = calendarCursor.getString(4); // do something }
注意:有更多可用的日历投影选项,建议阅读CalendarContract.Calendars
限制
自API Level 14,Android 4.0(ICE_CREAM_SANDWICH)起可以使用此功能
演示应用程序
完整的例子在this GitHub repository.(Android Studio 1.0.0项目)
需要日历同步并且必须由帐户拥有,并且必须可见.
更新:最新的例子
测试在Android 4.1.1和Android 5.0 Lollipop预览