如何在特定日历上打开日历应用程序

时间:2014-03-18 15:44:14

标签: android android-intent calendar

我想从Android应用程序打开日历应用程序,但具有特定的calendarId

我的代码:

final Intent calIntent = new Intent(Intent.ACTION_EDIT);
calIntent.setType("vnd.android.cursor.item/event");

startActivityForResult(calIntent, RESULT_CODE_OPEN);

但是使用上一个日历打开了意图。我想用他的日历ID打开一个特定的。

我该怎么做?

1 个答案:

答案 0 :(得分:11)

一点历史记录: 查看日历应用程序源代码,我发现清单this section表示哪个类处理Intent.ACTION_EDIT,{ {3}}。然后我找到EditEventActivity.java行; calendarId来自额外数据。所以...

打开EditEvent - (回答原始问题)

使用密钥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);

使用特定日历上的周视图打开日历应用程序 - (回答赏金问题 - 第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,
            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中,我创建了两个额外的辅助方法来推送和恢复日历可见性状态。看看pushCalendarVisibilityrestoreCalendarVisibility以及onActivityResult

注意:我已经测试了安装和未安装Google日历的应用。 Google日历上的AFAIK仅显示DAY视图,而不显示为MONTH。

在所有情况下,仅显示所选日历上的活动。

获取calendarIdAccount Name - (回答赏金问题 - 第2部分)

可以使用CalendarContract.Calendars获取

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预览版上进行了测试