我该如何查看我的日历意图的结果?

12

我从我的应用程序中使用意图启动日历:

    Calendar cal = Calendar.getInstance();              
    Intent intent = new Intent(Intent.ACTION_EDIT);
    intent.setType("vnd.android.cursor.item/event");
    intent.putExtra("beginTime", cal.getTimeInMillis());
    intent.putExtra("allDay", true);
    intent.putExtra("rrule", "FREQ=YEARLY");
    intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
    intent.putExtra("title", "Some title");
    startActivity(intent);

我无法弄清楚如何在用户保存预填充的日历条目后获取事件ID。我还想知道如果用户取消了日历提示并且没有保存这个新的预填充事件,该怎么办。

有什么与onActivityResult(...)相关的内容可以用作参考来引用日历事件吗?我需要这样做,以便稍后找到/打开日历事件进行查看/编辑。 [更新:] 是的,尝试了onActivityResult(...),但是在任何用户交互之前,意图会立即返回,因此这没用。

我想通过使用一个意图将任务交给日历应用程序来完成此操作(同时让用户从设备中可用的各种日历中进行选择),并避免从我的应用程序中重新创建日历UE。另外,我至少希望支持Android 2.2+。


你好,你找到解决方案了吗?我有几乎相同的问题,我想获取创建事件的ID。详情请见http://stackoverflow.com/questions/11508511/calendar-event-intent-startactivityforresult - Martin Vandzura
不,我最终使用了WebAPI并跳过了Android日历API:https://developers.google.com/google-apps/calendar/ 如果我没记错的话。 - Crocodile
如果我没记错的话,我的决定是由于需要支持早期平台版本(2.1+)而引导的。我正在调查各种方法,我不想依赖于任何早期Android平台版本中已不再支持的API功能。 - Crocodile
谢谢。我遇到了同样的问题,已经思考了几周找到合适的解决方案。在我的应用程序中,我需要创建重复的待办事件并将其推送到默认日历中似乎是理想的解决方案。但实际上不是这样,因为一些设备没有默认的日历。还有不支持2.1+日历API的问题。 - Martin Vandzura
6个回答

9
这是我的工作内容:
在启动意图之前,我会获取下一个事件 ID:
public static long getNewEventId(ContentResolver cr) {      
    Cursor cursor = cr.query(Events.CONTENT_URI, new String [] {"MAX(_id) as max_id"}, null, null, "_id");
    cursor.moveToFirst();
    long max_val = cursor.getLong(cursor.getColumnIndex("max_id"));     
    return max_val+1;
}

然后,我像往常一样调用意图:
        long event_id = EventUtility.getNewEventId(mContext.getContentResolver());

        Intent intent = new Intent(Intent.ACTION_INSERT)
        .setData(Events.CONTENT_URI)
        .putExtra(Events._ID, event_id)
        .putExtra(Events.TITLE, "title");

        startActivity(intent);

这是一个小技巧,在我活动的onResume()方法中,我会检查是否创建了与之前生成的event_id相同的新事件。如果它们相同,则表示已经创建了新的日历。然后,我将其储存在我的数据库中。

public static long getLastEventId(ContentResolver cr) {      
    Cursor cursor = cr.query(Events.CONTENT_URI, new String [] {"MAX(_id) as max_id"}, null, null, "_id");
    cursor.moveToFirst();
    long max_val = cursor.getLong(cursor.getColumnIndex("max_id"));     
    return max_val;
}

@Override
public void onResume() {
    super.onResume();

    long prev_id = EventUtility.getLastEventId(getContentResolver());

    // if prev_id == mEventId, means there is new events created
    // and we need to insert new events into local sqlite database.
    if (prev_id == mEventID) {
        // do database insert
    }
}

这肯定是解决问题的最佳方法。 - Reuben Scratton
这对我有效,但请注意getLastEventId和getNewEventId几乎完全相同,因此您可以避免一些重复。 - vonovak
1
请注意,getNewEventId 假设下一个事件的 ID 等于上一个事件的 ID 加 1,但如果您执行以下操作,则不是这样的:(1) 添加事件,(2) 添加事件,(3) 删除前一步骤中的事件,(4) 添加事件。 - vonovak

3

我认为你可以在onResume方法中通过开始时间检查事件。肯定不会有两个具有相同开始时间的事件。


好主意,我可以从这里想出一些东西。不过,用户能否从日历屏幕更改 beginTime,即事件的日期?或者用户永远无法更改它? - Crocodile

1
也许你可以通过编程的方式插入事件并发送一个“编辑”意图。

可以这样做,但是如果用户取消了我通过意图打开的日历屏幕(用于编辑),那么程序创建的事件将保留在未使用的日历中。我将无法找出用户是否保存或取消了事件的日历意图。 - Crocodile
你可以在 onResume 检查创建事件的修改日期.. 如果日期与创建日期相同 => 用户取消,否则用户保存它,这意味着隐式接受... 我不认为这种方法是理想的.. yodann 的方式更好。 - Maher Abuthraa

0

这可能听起来像是一个黑客技巧.. 但是,您可以在OnCreate中进行检查(当您的应用程序从日历应用程序返回前台时),通过使用日历提供程序API查询日历条目,以确定触发的事件是否已保存或取消。


嗨,这是我的思考过程。然而,我应该在onCreate或onStart中做些什么呢?我应该检查什么,事件ID吗? - Crocodile

-1

1
不幸的是,这种方法在任何日历应用程序中都不起作用。使用原生的谷歌应用程序不起作用,但在三星的日历应用程序中可以使用。 - Ruslan

-2

看起来你想使用startActivityForResult而不是startActivity。这里有一些文档可以参考。


1
这不适用于日历意图。当我尝试使用它时,这是我的代码,并且当日历意图启动时,它会立即返回。 <code>public void addcalendarevent(View view){ Intent intent = new Intent(Intent.ACTION_EDIT);startActivityForResult(intent, SET_CALENDAR); </code> - Crocodile
抱歉,您可以看到我显然不知道如何在StackOverflow上格式化评论。我的意思是,当使用startActivityForResult启动它时,intent会立即返回onActivityResult。 - Crocodile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接