【问题标题】:Specify calendar in Android event creation intent在 Android 事件创建意图中指定日历
【发布时间】:2017-11-02 17:07:43
【问题描述】:

我通过下面这段代码触发了日历事件的创建:

Intent intent = new Intent(Intent.ACTION_INSERT);
intent.setData(CalendarContract.Events.CONTENT_URI);
startActivity(intent);

但我想指定应该使用哪个日历来创建事件(即在事件创建屏幕中设置日历下拉菜单的初始值)。

我已尝试提供ACCOUNT_TYPEACCOUNT_NAMECALENDAR_ID

intent.putExtra(CalendarContract.Events.ACCOUNT_TYPE, accountType);
intent.putExtra(CalendarContract.Events.ACCOUNT_NAME, accountName);
intent.putExtra(CalendarContract.Events.CALENDAR_ID, calendarId);

但对日历下拉初始值没有影响。

是否可以在事件创建意图中指定日历?

【问题讨论】:

  • 也许你也需要设置ACCOUNT_TYPE
  • 不是 CalendarContract.Calendars.ACCOUNT_NAME 吗?
  • @kichik 我试过ACCOUNT_TYPEACCOUNT_NAMECALENDAR_ID,但是没有效果
  • @AmitK.Saha 它不会改变任何东西:它们都具有相同的值。
  • 您尝试了哪个日历应用程序?查看EditEventFragment.java 我想说它应该与AOSP 日历应用程序一起使用。但是,许多供应商(包括 Google)都有自己的专有日历应用程序,可能不支持此功能。 CalendarContact 未指定日历 ID 的配置。

标签: android android-intent android-calendar


【解决方案1】:

我相信,只有Intent 没有可靠的方法来实现这一点。您可能会遇到各种可能支持也可能不支持此功能的日历应用程序。

如果您不介意用户不能更改日历,您可以通过一个简单的技巧来实现:

只需在您想要的日历中创建一个“占位符”事件(如 Android 中的Developer Guide 中所述),然后为该事件触发一个Intent.ACTION_EDIT Intent

这里有一些(未经测试的)代码来展示它是如何工作的:

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();

// provide an initial time
long now=System.currentTimeMillis();
values.put(Events.DTSTART, now);
values.put(Events.DTEND, now+3600000);
values.put(Events.TITLE, "");
values.put(Events.CALENDAR_ID, calendarId);
values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());

// create the "placeholder" event
Uri uri = cr.insert(Events.CONTENT_URI, values);

// get the event ID that is the last element in the Uri
long eventId = Long.parseLong(uri.getLastPathSegment());

// launch the editor to edit the "placeholder" event
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setData(ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventId));
startActivityForResult(intent, 0);

编辑Intent 可能不会返回告诉您事件是否已保存或用户是否在未保存的情况下关闭编辑器的状态。所以你应该回读这个事件并检查它是否被用户修改过,如果没有被修改过就删除它。

【讨论】:

  • 如何查看用户是否修改了事件?
  • 您知道事件 ID,只需加载事件并将值与传递给插入操作的值进行比较。请注意,用户可以删除事件或将其移动到另一个日历(某些日历应用程序支持),因此您应该为您的占位符事件不再存在(或具有不同的 id)做好准备。
  • 有没有人尝试过这种解决方法?该事件按预期创建,我正在使用创建的事件 ID 打开 URI,但编辑页面不包含任何已创建事件的数据,只有我添加到 Intent 的新数据,所以我认为它只是默认值创建而不是编辑。也许我需要等待一段时间让事件传播?还有什么我可能做错的吗?
  • 我已经对此进行了一些测试。上面的代码使用“aCalendar”按预期工作。它部分适用于 AOSP 和股票 HTC 日历应用程序。在这些情况下,标题、描述和位置会正确显示,但日期和时间字段则不会。在这些情况下,可以通过将EXTRA_EVENT_BEGIN_TIMEEXTRA_EVENT_END_TIME 添加到编辑意图来“修复”它。它似乎不适用于 Google 的日历应用程序。
【解决方案2】:

使用这个简单的方法添加事件很简单。

public void onAddEventClicked(View view) {
        Intent intent = new Intent(Intent.ACTION_INSERT);
        intent.setType("vnd.android.cursor.item/event");

        Calendar cal = Calendar.getInstance();
        long startTime = cal.getTimeInMillis();
        long endTime = cal.getTimeInMillis() + 60 * 60 * 1000;

        intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startTime); 
        intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime);

        intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true);

        //This is Information about Calender Event.
        intent.putExtra(Events.TITLE, "Siddharth Birthday");
        intent.putExtra(Events.DESCRIPTION, "This is a description");
        intent.putExtra(Events.EVENT_LOCATION, "My Guest House");
        intent.putExtra(Events.RRULE, "FREQ=YEARLY");

        startActivity(intent);
    }

【讨论】:

  • 谢谢,但这并不能回答问题。
【解决方案3】:

使用以下代码 sn-p 调用默认日历事件。

Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
intent.setType("vnd.android.cursor.item/event");
startActivity(intent);

以下代码包可用于将信息传递给日历意图。

intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startTime);
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME,endTime);
intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true);
intent.putExtra(Events.TITLE, "Neel Birthday");
intent.putExtra(Events.DESCRIPTION, "This is a sample description");
intent.putExtra(Events.EVENT_LOCATION, "My Guest House");
intent.putExtra(Events.RRULE, "FREQ=YEARLY");

希望对你有帮助:) 谢谢。

来源:How to Add an Event to Device Calendar in Android

你也可以看看这个。 Adding Events to the User’s Calendar

【讨论】:

  • 您在 sn-p 中的何处提供日历 ID?
  • 好的,但我在任何教程中都没有找到日历 ID,即使我不知道。为什么要通过呢?
  • 因为我想选择在哪个帐户上创建活动
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多