我想从Android应用程序打开日历应用程序,但具有特定的calendarId
。
我的代码:
final Intent calIntent = new Intent(Intent.ACTION_EDIT);
calIntent.setType("vnd.android.cursor.item/event");
startActivityForResult(calIntent, RESULT_CODE_OPEN);
但是使用上一个日历打开了意图。我想用他的日历ID打开一个特定的。
我该怎么做?
答案 0 :(得分:11)
一点历史记录: 查看日历应用程序源代码,我发现清单this section表示哪个类处理Intent.ACTION_EDIT,{ {3}}。然后我找到EditEventActivity.java行; calendarId
来自额外数据。所以... 的
使用密钥CalendarContract.Events.CALENDAR_ID
和相应的calendarId
对此示例进行更长时间的处理:
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);
这种方法有点不同。在打开日历应用程序之前,您应该隐藏所有日历,但不能选择所选日历。所以,我已经创建了一个辅助函数来完成它。
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,
updateValues, 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中,我创建了两个额外的辅助方法来推送和恢复日历可见性状态。看看pushCalendarVisibility
和restoreCalendarVisibility
以及onActivityResult
注意:我已经测试了安装和未安装Google日历的应用。 Google日历上的AFAIK仅显示DAY视图,而不显示为MONTH。
在所有情况下,仅显示所选日历上的活动。
calendarId
和Account Name
- (回答赏金问题 - 第2部分) calendarId
abd Account Name
,如下所示:
// 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, null, 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
}
注意:日历投影有更多可用选项,建议阅读this
此功能自API Level 14,Android 4.0(ICE_CREAM_SANDWICH)
起可用 CalendarContract.Calendars
中的完整示例。 (Android Studio 1.0.0项目)
需要同步日历,并且必须由帐户拥有并且必须可见。
更新:示例最新
在Android 4.1.1和Android 5.0 Lollipop预览版上进行了测试