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

use*_*863 10 android calendar android-intent

我想从Android应用程序打开日历应用程序,但具体calendarId.

我的代码:

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

startActivityForResult(calIntent, RESULT_CODE_OPEN);
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

rnr*_*ies 11

一点历史: 查看日历应用程序源代码,我发现清单的这一部分表明哪个类处理Intent.ACTION_EDIT,EditEventActivity.java.然后我找到了条线; calendarId是从额外的数据中获得的.所以...

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

在Intent上添加一个额外的长按键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);
Run Code Online (Sandbox Code Playgroud)

使用特定日历上的月份周视图打开日历应用程序- (回答赏金问题 - 第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);
}
Run Code Online (Sandbox Code Playgroud)

在这里如何设置它:

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);
Run Code Online (Sandbox Code Playgroud)

AFAIK,无法打开月视图.但研究永远不会结束,我会尽快做更新.

在DemoApp中,我创建了两个额外的辅助方法来推送和恢复日历可见性状态.看看角落找寻pushCalendarVisibilityrestoreCalendarVisibilityonActivityResult

注意:我已经测试了安装和未安装Google日历的应用.Google日历上的AFAIK仅显示DAY视图,而不是每周都显示.

在所有情况下,仅显示所选日历上的事件.

得到calendarIdAccount Name- (回答赏金问题 - 第2部分)

calendarIdAccount Name可以使用CalendarContract.Calendars获取abd ,如下所示:

// 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

}
Run Code Online (Sandbox Code Playgroud)

注意:有更多可用的日历投影选项,建议阅读CalendarContract.Calendars

限制

从API Level 14,Android 4.0(ICE_CREAM_SANDWICH)开始提供此功能

演示应用程序

此GitHub存储库中的完整示例.(Android Studio 1.0.0项目)需要同步日历,并且必须由帐户拥有并且必须可见. 更新:示例最新

在Android 4.1.1和Android 5.0 Lollipop预览版上测试