sar*_*ath 5 android android-contentprovider android-calendar
我正在开发一个Android应用程序.我必须将事件添加到原生Android日历中.所以我尝试了以下代码:
if (Build.VERSION.SDK_INT >= 8 ) {
l_eventUri = Uri.parse("content://com.android.calendar/events");
} else {
l_eventUri = Uri.parse("content://calendar/events");
}
Cursor cursor = getContentResolver() .query(Uri.parse(getCalendarUriBase(this)),new String[] { "calendar_id", "displayname"}, null,null, null);
cursor.moveToFirst();
// fetching calendars name
String CNames[] = new String[cursor.getCount()];
// fetching calendars id
int[] CalIds = new int[cursor.getCount()];
for (int i = 0; i < CNames.length; i++) {
CalIds[i] = cursor.getInt(0);
CNames[i] = cursor.getString(1);
cursor.moveToNext();
}
// get calendar
Calendar cal = Calendar.getInstance();
Uri EVENTS_URI = Uri.parse(getCalendarUriBase(this) + "events");
ContentResolver cr = getContentResolver();
// event insert
ContentValues values = new ContentValues();
values.put("calendar_id",111);
values.put("title", "Reminder Title");
values.put("allDay", 0);
values.put("dtstart", cal.getTimeInMillis() + 11*60*1000); // event starts at 11 minutes from now
values.put("dtend", cal.getTimeInMillis()+60*60*1000); // ends 60 minutes from now
values.put("description", "Reminder description");
//Event Id
values.put("_id", 23);
//0~ default; 1~ confidential; 2~ private; 3~ public
values.put("visibility", 0);
//0~ false; 1~ true
values.put("hasAlarm", 1);
//status: 0~ tentative; 1~ confirmed; 2~ canceled
values.put("eventStatus", 1);
//0~ opaque, no timing conflict is allowed; 1~ transparency, allow overlap of scheduling
values.put("transparency", 0);
Uri event = cr.insert(EVENTS_URI, values);
// reminder insert
Uri REMINDERS_URI = Uri.parse(getCalendarUriBase(this) + "reminders");
values = new ContentValues();
values.put( "event_id", Long.parseLong(event.getLastPathSegment()));
values.put( "method", 1 );
values.put( "minutes", 10 );
cr.insert( REMINDERS_URI, values );
private String getCalendarUriBase(Activity act) {
String calendarUriBase = null;
Uri calendars = Uri.parse("content://calendar/calendars");
Cursor managedCursor = null;
try {
managedCursor = act.managedQuery(calendars, null, null, null, null);
} catch (Exception e) {
}
if (managedCursor != null) {
calendarUriBase = "content://calendar/";
} else {
calendars = Uri.parse("content://com.android.calendar/calendars");
try {
managedCursor = act.managedQuery(calendars, null, null, null, null);
} catch (Exception e) {
}
if (managedCursor != null) {
calendarUriBase = "content://com.android.calendar/";
}
}
return calendarUriBase;
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我得到了IllegalArgumentException.
java.lang.IllegalArgumentException: Unknown URL content://com.android.calendar/
Run Code Online (Sandbox Code Playgroud)
我认为错误是因为getCalendarUriBase()方法.我搜索了很多其他方法,但到目前为止大多数开发人员都遵循上面的代码片段,因为这适用于每个Android版本.怎么解决?
calendars当你尝试执行这一行时你错过了
Cursor cursor = getContentResolver().query(
Uri.parse(getCalendarUriBase(this)), /* <-- unknown URL content */
new String[] { "calendar_id", "displayname" },
null,null,null);
Run Code Online (Sandbox Code Playgroud)
导致IllegalArgumentException。
只需添加calendars后面的即可getCalendarUriBase(this)。
Cursor cursor = getContentResolver().query(
Uri.parse(getCalendarUriBase(this)+"calendars"),
new String[] { "_id", "displayName" },
null,null,null);
Run Code Online (Sandbox Code Playgroud)
笔记:
_id如果从表中查询,则用于获取日历 IDcalendars。calendar_id被定义为其他表中的外键(例如events)。- 用于
displayName姜饼或以下。对于冰淇淋三明治及以上,请使用calendar_displayName。
添加事件时,您需要包括:日历 ID、开始日期、结束日期(或重复规则)和事件时区。您已包括除时区之外的所有内容。尝试添加
values.put("eventTimezone", TimeZone.getDefault().getID());
Run Code Online (Sandbox Code Playgroud)
在插入事件之前。
| 归档时间: |
|
| 查看次数: |
1466 次 |
| 最近记录: |