微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我的代码

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

startActivityForResult(calIntent,RESULT_CODE_OPEN);

但是用最后一个日历打开的意图.我想用他的日历ID打开特定的一个.

我怎样才能做到这一点?

解决方法

有一点历史:查看日历应用程序源,我发现了 this section的manifest,表示什么类处理Intent.ACTION_EDIT,EditEventActivity.java.然后我发现 this行; calendarId是从额外的数据获得的.所以…

打开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.

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

获取日历ID和帐户名称 – (回答奖金问题 – 第2部分)

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预览

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐