在 android 中以编程方式使用谷歌日历添加同步事件
Posted
技术标签:
【中文标题】在 android 中以编程方式使用谷歌日历添加同步事件【英文标题】:sync event added programmatically with google calendar in android 【发布时间】:2012-02-13 16:39:05 【问题描述】:我正在尝试将事件添加到 android 日历,并指定将事件添加到 gmail 日历以便自动与 Google 日历同步。 问题是以编程方式添加的事件不与谷歌日历同步,但如果我在手机上手动添加它,它会与谷歌日历同步。我不知道为什么。
这是我用来添加事件的代码:
ArrayList<MyCalendar> calendars = new ArrayList<MyCalendar>();
String[] projection = new String[] "_id", "name" ;
Uri calUri = getCalendarURI(false);
Cursor managedCursor = managedQuery(calUri, projection, "selected=1",
null, null);
String calName = null;
String calId = null;
if (managedCursor.moveToFirst())
int nameColumn = managedCursor.getColumnIndex("name");
int idColumn = managedCursor.getColumnIndex("_id");
do
calName = managedCursor.getString(nameColumn);
calId = managedCursor.getString(idColumn);
calendars.add(new MyCalendar(Integer.parseInt(calId), calName));
while (managedCursor.moveToNext());
Toast.makeText(getBaseContext(), calName + " " + calId,
Toast.LENGTH_LONG).show();
Calendar cal = Calendar.getInstance();
ContentValues event = new ContentValues();
event.put("calendar_id", 2);
event.put("title", "Test Event2");
event.put("description", "Hiii Buddy");
long startTime = cal.getTimeInMillis();
long endTime = cal.getTimeInMillis() + 60 * 60 * 1000;
event.put("dtstart", startTime);
event.put("dtend", endTime);
event.put("allDay", 0);
event.put("eventStatus", 1);// tentative 0, confirmed 1 canceled 2
event.put("visibility", 3);// default 0 confidential 1 private 2
// public 3
event.put("transparency", 0);// opaque 0 transparent 1
event.put("hasAlarm", 1); // 0 false, 1 true
Uri eventsUri = getCalendarURI(true);
Uri url = getContentResolver().insert(eventsUri, event);
因此,该活动已成功添加到日历中,但未显示在网络上的 Google 日历中(不同步),但如果我手动添加该活动,它会同步!!!
【问题讨论】:
@我也有同样的问题。你的问题解决了吗??? 你有什么解决办法吗? 【参考方案1】:您可以通过此功能添加事件后同步您的事件,它对我有用(在 API 8 及更高版本中):
public static void syncCalendar(Context context, String calendarId)
ContentResolver cr = context.getContentResolver();
ContentValues values = new ContentValues();
values.put(CalendarContract.Calendars.SYNC_EVENTS, 1);
values.put(CalendarContract.Calendars.VISIBLE, 1);
cr.update(
ContentUris.withAppendedId(getCalendarUri(),
Long.parseLong(calendarId)), values, null, null);
【讨论】:
您能否将您的 getCalendarUri() 函数添加到答案中。【参考方案2】:尝试使用此代码将事件插入到 android 日历和 google 日历中:
ContentValues values = new ContentValues();
cal_id = String.valueOf(p1);
values.put("calendar_id", p1);
values.put("title", title1);
values.put("allDay", 0);
values.put("dtstart", settime);
values.put("dtend", cal.getTimeInMillis()+60*60*1000);
values.put("description", desc1);
values.put("visibility", 0);
values.put("transparency", 0);
values.put("hasAttendeeData", 1);
values.put("hasAlarm", 0);
event = cr.insert(EVENTS_URI, values);
event1=event;
dat1 = event.toString();
long id=-1;
if (event != null)
id = Long.parseLong(event.getLastPathSegment());
ContentValues values1 = new ContentValues();
values1.put("event_id", id);
values1.put("method", 1); //METHOD_ALERT
Uri reminder = Uri.parse(getCalendarUriBase(this) + "reminders");
this.getContentResolver().insert(reminder, values1);
if(s.length() > 0 || partmail.length() > 0)
//REQUIRES FOLLOWING CODE
此代码用于将事件同步添加到谷歌日历
ContentValues attendees = new ContentValues();
attendees.put("event_id", id);
attendees.put("attendeeEmail", partmail1);
attendees.put("attendeeRelationship", 2);//RELATIONSHIP_ATTENDEE
attendees.put("attendeeStatus", 3); //ATTENDEE_STATUS_INVITED
attendees.put("attendeeType", 1); //TYPE_REQUIRED
id1=(int)id;
alarmid = (int) id;
Uri attendeesUri = null;
if (Integer.parseInt(Build.VERSION.SDK) >= 8 )
attendeesUri = Uri.parse("content://com.android.calendar/attendees");
else if(Integer.parseInt(Build.VERSION.SDK) < 8)
attendeesUri = Uri.parse("content://calendar/attendees");
this.getContentResolver().insert(attendeesUri, attendees);
Toast.makeText(this, "Task Scheduled Successfully", Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, "Could not create Task!", Toast.LENGTH_SHORT);
// reminder insert
Uri REMINDERS_URI = Uri.parse(getCalendarUriBase(this) + "reminders");
values = new ContentValues();
values.put( "event_id", id);
values.put( "method", 1 );
values.put( "minutes", 0 );
cr.insert( REMINDERS_URI, values );
获取日历的 Uri,因为它在 API 级别(例如直到 8、大于 8 和大于 11)上有所不同。
private String getCalendarUriBase(Context con)
String calendarUriBase = null;
Uri calendars = Uri.parse("content://calendar/calendars");
Cursor managedCursor = null;
try
managedCursor = managedQuery(calendars, null, null, null, null);
catch (Exception e)
// eat
if (managedCursor != null)
calendarUriBase = "content://calendar/";
else
calendars = Uri.parse("content://com.android.calendar/calendars");
try
managedCursor = managedQuery(calendars, null, null, null, null);
catch (Exception e)
// statement to print the stacktrace
if (managedCursor != null)
calendarUriBase = "content://com.android.calendar/";
return calendarUriBase;
【讨论】:
问题不在于添加事件。该事件已添加到本地日历并显示为谷歌日历的事件,但不在谷歌日历中。【参考方案3】:使用here提供的google calender api
上面的参考有点笼统,因为 Android 没有提供官方 API。所以,另一个更具体的 android 解决方案是 An Android Tutorial–Programming with Calendar
其中也包含一个工作示例。此外,请注意 READ_CALENDAR 、 WRITE_CALENDAR 等权限声明
【讨论】:
以上是关于在 android 中以编程方式使用谷歌日历添加同步事件的主要内容,如果未能解决你的问题,请参考以下文章
约束布局中以编程方式添加的按钮将忽略约束 - Android
如何使用 android 使用日历 API 在谷歌日历上添加事件?
在 Android 2.2 中以编程方式启动“添加帐户”活动
如何在 Android 上的 TabLayout 中以编程方式添加选项卡