2012-09-10 49 views
4

对于我的一个应用程序,我们必须在日历中插入一个事件。在Android中插入日历项目ICS

long calID = 3; 
long startMillis = 0; 
long endMillis = 0;  
Calendar beginTime = Calendar.getInstance(); 
beginTime.set(2012, 8, 10, 7, 30); 
startMillis = beginTime.getTimeInMillis(); 
Calendar endTime = Calendar.getInstance(); 
endTime.set(2012, 8, 10, 8, 45); 
endMillis = endTime.getTimeInMillis(); 
ContentResolver cr = getContentResolver(); 
ContentValues values = new ContentValues(); 
values.put(Events.DTSTART, startMillis); 
values.put(Events.DTEND, endMillis); 
values.put(Events.TITLE, "Jazzercise"); 
values.put(Events.DESCRIPTION, "Group workout"); 
values.put(Events.CALENDAR_ID, calID); 
values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles"); 
Uri uri = cr.insert(CalendarContract.Calendars.CONTENT_URI, values); 
// get the event ID that is the last element in the Uri 
long eventID = Long.parseLong(uri.getLastPathSegment()); 
Log.d("MainActivity", "addCalendarEvents :: " + "eventID :: "+eventID); 

Cursor cursor = cr.query(Events.CONTENT_URI, null, Events.TITLE +"='Jazzercise'", null, null); 
Log.d("MainActivity", "addCalendarEvents :: " + "cursor :: "+cursor.getCount()); 

http://developer.android.com/guide/topics/providers/calendar-provider.html 。然而,首先,它给了我一个错误

Failed to get type for: content://com.android.calendar (Unknown URL content://com.android.calendar) 

而且光标计数为零。当我尝试用标题进行搜索时。 注:我尝试使用intents服务来添加事件,但是我不想让用户在添加事件时自行决定。

我已经在Galaxy Nexus(4.1)和Nexus S(4.1)上测试过它。

任何与ICS一起使用的正确UI的帮助?

BR, Jayshil

+0

注:我没有得到明确的崩溃或错误。 –

+0

如果开发者社区的人在4.0 ICS设备中尝试这样做,那真的很有帮助。如果它是一个Jellybean问题或4.0以上的问题。 –

+2

这个错误出现在糖果豆更新后,我有一个nexus 7相同的问题。在ICS上,我的代码正常工作,更新后停止,logcat报告您引用的行。然后它提供了com.google.android.calendar作为替代,但如果我在我的代码中替换它,这仍然不起作用。 –

回答

3

我已经想通了。行:

Failed to get type for: content://com.android.calendar (Unknown URL content://com.android.calendar) 

是一个完整的红鲱鱼(即不相关)。这只是执行基础架构工作的一些框架代码,as seen here


问题就出在文档中 - 如果你像我一样,你可能期望long calID = 3;是一些有效的日历ID。 这不是一个有效的ID,它是一个占位符,用于文档

如果您使用的是空白模拟器,您将如何处理上述代码,将条目插入到不存在的日历中,即无法看到。

你需要做的是:

  1. Query for and choose an existing calendar。再次 - 模拟器上的,没有默认日历
  2. 使用获取的实际日历ID插入事件。

简而言之 - 文档和调试消息不足以防止白痴;)。

+1

喜欢最后一行..我刚刚找到相同的解决方案几天回来..并必须交给你... –

+1

之间的最新文档是好得多..他们首先让你查询日历,然后显示如何插入。 –

0

你有没有在清单文件正确的权限?

<uses-permission android:name="android.permission.READ_CALENDAR" /> 
<uses-permission android:name="android.permission.WRITE_CALENDAR" /> 

这可能是您看到的错误原因的一部分。

+0

是的,我有这些权限。 –

0
content://com.android.calendar - problem is here. 

它的压光机。

尝试使用此代码:

Uri mCalendarsUri; 
if (Build.VERSION.SDK_INT >= 8) { 
    mCalendarsUri = Uri.parse("content://com.android.calendar/calendars"); 
} else { 
    mCalendarsUri = Uri.parse("content://calendar/calendars"); 
}