如何使用Intents添加日历事件?

时间:2013-12-13 09:52:14

标签: java android android-intent calendar android-contentprovider

我正在尝试为2.2和2.3设备插入日历事件。我正在使用intents方法,如下所述:

http://developer.android.com/guide/topics/providers/calendar-provider.html#intents

它适用于4.1设备。

但是我需要它与2.2+设备兼容,所以我重构了应用程序以摆脱CalendarContract.CONTENT_URI,以便它可以在版本< 14.

我现在正在使用这个Uri,自Froyo以来AFAIK兼容:

    content://com.android.calendar

但我总是在Froyo和Gingerbread设备中遇到这个例外:

    android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.INSERT dat=content://com.android.calendar/events (has extras) }

这些意图也失败了:

    Intent { act=android.intent.action.VIEW dat=content://com.android.calendar/time/1386926751452 }

    Intent { act=android.intent.action.INSERT dat=content://com.android.calendar/events (has extras) }

    Intent { act=android.intent.action.EDIT dat=content://com.android.calendar/events (has extras) }

尽管如此,我还是尝试了之前的内容Uri(内容://日历),即使知道它是1.5和1.6也有相同的结果。

无需说我已经检查过我用于测试的每台设备都安装了日历。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

我在this answer找到了解决方案。

内容提供商Uri仅适用于API 14及以上版本。对于以前的操作系统版本,意图不应该设置数据uri,而是需要日历应用程序MIME类型:

    Intent intent = new Intent(Intent.ACTION_EDIT);
    if (Build.VERSION.SDK_INT >= 14) {
        intent.setData("content://com.android.calendar/events");
    } else {
        intent.setType("vnd.android.cursor.item/event");
    }

令人惊讶的是,打开日历的意图适用于内容提供商Uri(没有“事件”路径)。事实证明,此代码可以从Froyo运行到更新的ICS设备:

    Uri.Builder builder = Uri.parse("content://com.android.calendar").buildUpon();
    builder.appendPath("time");
    ContentUris.appendId(builder, System.currentTimeMillis());
    Intent intent = new Intent(Intent.ACTION_VIEW).setData(builder.build());

    startActivity(intent);

我认为谷歌的人们应该为日历推出某种兼容性库。如果不关心我们正在使用的操作系统版本,能够启动意图(甚至访问ContentProvider)真的很棒。是的我知道MIME类型不是官方的,数据库已经更改,因此它可能在某些设备中不起作用。但是对旧设备的一些支持总比没有支持要好。