我正在尝试为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也有相同的结果。
无需说我已经检查过我用于测试的每台设备都安装了日历。
我错过了什么吗?
答案 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类型不是官方的,数据库已经更改,因此它可能在某些设备中不起作用。但是对旧设备的一些支持总比没有支持要好。